上一篇文章讲了 Kotlin 泛型:基本使用,接下来我们再进一步了解泛型使用相关的进阶知识。本篇是 Kotlin 泛型类型参数约束的讲解,更多内容可点击链接查看。...Kotlin 泛型:基本使用Kotlin 泛型:类型参数约束系列持续更新中,欢迎关注订阅。...为什么需要类型参数约束在上一篇文章里,我们使用泛型定义了一个泛型列表List,使用这个列表,我们可以在使用的时候,实例化出各种具体类型的列表,比如字符串列表List、整型列表List...为了新增一种设备,搞得这么轰轰烈烈,值得吗?我想 QA 同学在回归其他打印机设备的时候,心里想得肯定是给编写代码的你寄刀片吧?利用范型约束实现非空范型Kotlin 有一个为人称道的特性:不可空。...中的泛型属性也同样变得可空,这使得泛型类在具体实现的时候,需要考虑参数为空的情况,也让编写代码的具体实现变得复杂。
, 主构造函数之前 , 该泛型参数 T 是 类型占位符 , 在 该泛型类类中 可以使用 类型占位符 T 作为一个类 使用 , 可以 定义 T 类型成员属性 主构造函数中可以接收 T 类型的实例对象作为参数..., T 类型可以 作为函数的返回值 ; 通常情况下 , 泛型参数 都使用 T 表示 , 使用其它字母 或者 字符串 都可以表示 泛型参数 , 但是 约定俗成 都使用 T 来表示泛型 ; 代码示例 :...---- 通常情况下 , 泛型参数 都使用 T 表示 , 使用其它字母 或者 字符串 都可以表示 泛型参数 , 但是 约定俗成 都使用 T 来表示泛型 ; 在下面的代码中 , 使用 M 作为 泛型参数..., 需要两个泛型参数来表示其类型 ; T 类型在泛型类中注明 , 可以在该泛型类 Student 中随意使用 , 但是 泛型参数 R 是首次在该函数中使用 , 因此需要在该函数的 fun 关键字...return action(item) } 在 尖括号 中声明 泛型参数 时 , 可以指定 泛型类型 的 约束 , 如 泛型类型 必须是某个类型的子类 ; 在下面的代码中 , Soldier
放在 尖括号 中 , 该泛型参数放在 类名后 , 主构造函数之前 , 该泛型参数 T 是 类型占位符 , 在 该泛型类类中 可以使用 类型占位符 T 作为一个类 使用 , 可以 定义 T 类型成员属性...主构造函数中可以接收 T 类型的实例对象作为参数 , T 类型可以 作为函数的返回值 ; 通常情况下 , 泛型参数 都使用 T 表示 , 使用其它字母 或者 字符串 都可以表示 泛型参数 , 但是 约定俗成...> 子类 , Producer 的泛型参数 FastFood 是 Food 的子类 , 在 Kotlin 中 , 可以将 Producer 类型赋值给 Producer...---- 泛型参数类型 T 在 运行时 会被 类型擦除 , 因此 在运行时 是 不知道 泛型参数 的 具体类型 的 , 借助 reified 关键字 可以检查 运行时 泛型参数 的 具体类型 ;...在 Java 中 , 运行时 不知道 泛型参数 的 具体类型 ; 在 Kotlin 中可以 通过 reified 关键字检查 泛型参数类型 ; Java 中如果想要知道 泛型参数 具体类型 , 通过常规的方法无法实现
>(); | ^----------^ 可以这样写: jshell> List<?
Java 泛型的优点 泛型是 Java 5 的重要特性之一。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。...这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。...Kotlin 泛型 Kotlin 基于 Java 6,因此 Kotlin 天生支持泛型。但是 Kotlin 的泛型有自己的特点。...Kotlin 如何获得声明的泛型类型 跟 Java 一样,Kotlin 也是通过类型擦除支持泛型。 但是 Kotlin 的数组支持泛型,因此它们并不会协变。...; class [Ljava.lang.String; 4.2 实例化类型参数代替类引用 再举一个 Kotlin 使用 Gson 的反序列化的例子,可以使用实例化类型参数 T::class.java inline
" foo[int](5, s) //ok foo[int,](5, s) //ok 那么,除了函数参数列表中的参数类型可以作为类型实参推断的依据外,函数返回值的类型是否也可以呢?...像这样在定义中带有类型参数的类型就被称为泛型类型(generic type)。 从例子中的 maxableSlice 类型声明中我们可以看到,在泛型类型中,类型参数列表放在类型名字后面的方括号中。...和泛型函数一样,泛型类型可以有多个类型参数,类型参数名通常是首字母大写的,这些类型参数也必须是具名的,且命名唯一。...的类型等价于下面代码: type maxableIntSlice struct { elems []int } 看到这里你可能会问:泛型类型是否可以像泛型函数那样实现类型实参的自动推断呢?...} 另外,泛型方法中的 receiver 中类型参数名字可以与泛型类型中的类型形参名字不同,位置和数量对上即可。
- 使用 in 关键字 , 可以使 父类泛型对象 赋值给 子类泛型对象 ; 在 泛型类 中 , 如果只将 泛型类型 作为 函数的参数 类型 , 则在 声明 泛型参数 类型 时 , 在 泛型参数 前...语言中 , 泛型参数是 子类 的 泛型类对象 , 可以赋值给 泛型参数 是父类 的变量 , 前提是泛型参数必须使用 out 关键字修饰 ; 使用 in 关键字 , 可以使 父类泛型对象 赋值给...> 子类 , Producer 的泛型参数 FastFood 是 Food 的子类 , 在 Kotlin 中 , 可以将 Producer 类型赋值给 Producer...---- 泛型参数类型 T 在 运行时 会被 类型擦除 , 因此 在运行时 是 不知道 泛型参数 的 具体类型 的 , 借助 reified 关键字 可以检查 运行时 泛型参数 的 具体类型 ;...在 Java 中 , 运行时 不知道 泛型参数 的 具体类型 ; 在 Kotlin 中可以 通过 reified 关键字检查 泛型参数类型 ; Java 中如果想要知道 泛型参数 具体类型 , 通过常规的方法无法实现
第一章都是讲泛型的,距离上一篇Effective C#的随笔已经是很久以前的事情了。。。 今天Item4,讲的是泛型的类型推断功能。...首先上一段不用泛型的代码。...但是这样意味着要写更多代码,写更多编译器和JIT引擎可以帮你实现的代码。 接下来泛型上场,原文叫“correct answer”。...①类型转换。泛型类中的LoadFromFile方法,返回的类型其实已经被限定了,就是T类型,至于T具体是什么类型,就看自己在调用的时候尖括号之间写的具体的值了。...最后一段: 很多时候如果用了Type类型的参数,通常都可以定义出一个泛型的版本。编译器就会 “Create the Specific version for you.”。
泛型约束(Generic constraints) Kotlin 跟 Java 一样,也拥有泛型约束。Java 使用 extends 关键字指明上界。...在 Kotlin 中使用:代替 extends 对泛型的的类型上界进行约束。...而使用 in 时,编译可以通过,因为该参数只能出现在方法的入参。 此时,list2 和 list3 分别表示一个受限制的 MutableList。在 Kotlin 中,这种行为被称之为类型投影。...四.总结 本文是 Kotlin 范型系列的最后一篇文章。 本文讲述了 Kotlin 泛型约束、类型投影、星号投影的特性。...范型是 Kotlin 的高级特性,相对于 Java 的范型,它拥有更多的概念。 该系列的相关文章: Kotlin 范型之协变、逆变 Kotlin 泛型之类型擦除
这个概念在泛型星投影的时候是有应用的,具体后面会解释。 #### 作用三 而除此之外,Nothing 还有助于编译器进行代码流程的推断。...定义泛型类型字段,可以完整地写明类型参数,如果编译器可以自动推定类型参数,也可以省略类型参数: ``` abstract class Color(var t: T/*泛型字段*/) {...= tClass.newInstance() return t } ``` ### 泛型约束 Java 中可以通过有界类型参数来限制参数类型的边界,Kotlin中泛型约束也可以限制参数类型的上界...中竟然能将List赋值给List,不是说好的Kotlin和Java的泛型原理是一样的吗?...in位置,而函数返回类型叫作out位置 #### 协变 :保留子类型化关系 如果在定义的泛型类和泛型方法的泛型参数前面加上out关键词,说明这个泛型类及泛型方法是协变,简单来说类型A是类型B的子类型
调用泛型函数调用泛型函数时,可以在函数名后面用方括号指定具体的类型参数,也可以省略类型参数,让编译器根据传入的参数类型进行推断。...// PrintInt(3.14) // 编译错误:float64 does not implement int|int64 (float64 missing in int | int64)定义泛型类型也可以使用类型参数来定义泛型结构体...Go语言泛型的核心特性Go语言泛型的核心特性主要包括以下几点:类型参数化:泛型允许在函数、方法和类型定义中使用类型参数,这些参数在实例化时会被具体的类型所替代。...类型推断:在调用泛型函数或实例化泛型类型时,Go编译器可以自动推断出类型参数的具体类型,从而简化了泛型的使用。类型安全:泛型在编译时进行类型检查,确保类型参数的使用是安全的,避免了运行时类型错误。...灵活性:泛型可以处理多种数据类型,使得代码更加通用和灵活,能够适应不同的需求。4. Go语言泛型与Any的不同点类型安全:使用泛型可以在编译时获得更强的类型检查。
但泛型还有一种较为准确的说法就是为了参数化类型,或者说可以将类型当作参数传递给一个类或者是方法。 那么,如何解释类型参数化呢?...泛型除了可以将类型参数化外,而参数一旦确定好,如果类似不匹配,编译器就不通过。 上面代码显示,无法将一个 String 对象设置到 cache2 中,因为泛型让它只接受 Integer 的类型。...所以,综合上面信息,我们可以得到下面的结论。 与普通的 Object 代替一切类型这样简单粗暴而言,泛型使得数据的类别可以像参数一样由外部传递进来。它提供了一种扩展能力。...public class Test { String field1; } 当然,泛型类不至接受一个类型参数,它还可以这样接受多个类型参数。...而泛型类中的类型参数与泛型方法中的类型参数是没有相应的联系的,泛型方法始终以自己定义的类型参数为准。 所以,针对上面的代码,我们可以这样编写测试代码。
转载自 frank909 的文章 《Java 泛型,你了解类型擦除吗?》 ---- 泛型,一个孤独的守门者。 大家可能会有疑问,我为什么叫做泛型是一个守门者。...但泛型还有一种较为准确的说法就是为了参数化类型,或者说可以将类型当作参数传递给一个类或者是方法。 那么,如何解释类型参数化呢?...泛型除了可以将类型参数化外,而参数一旦确定好,如果类似不匹配,编译器就不通过。...public class Test { String field1; } 当然,泛型类不至接受一个类型参数,它还可以这样接受多个类型参数。...而泛型类中的类型参数与泛型方法中的类型参数是没有相应的联系的,泛型方法始终以自己定义的类型参数为准。 所以,针对上面的代码,我们可以这样编写测试代码。
关于泛型 熟悉class文件结构以及字节码的朋友应该都知道,Java泛型是通过"类型擦除"实现的,在编译期由编译器将泛型擦除,泛型类擦除后就是对应类型的裸类型。...那么,我们如何通过反射获取一个泛型类的参数化类型T的实际类型呢?...这样我们就可以从类型签名中拿到参数T的实际类型为Job。...也就能获取到泛型List的参数T的类型。...实例的getGenericSuperclass方法获取泛型父类; 3、最后调用Type的getActualTypeArguments方法获取泛型父类的参数实际类型; 泛型也叫参数化类型ParameterizedType
因为我们的数组中存储的元素类型是不确定的,所以这里我们用到了泛型,其中where T : strut子句约束参数类型T必须为值类型。当然这个程序我们不使用泛型,直接定义Object类型的数组也可以。...下面重点说说C#中泛型类型参数的约束: 在定义泛型类时,可以对客户端代码能够在实例化类时用于类型参数的类型种类施加限制。 如果客户端代码尝试使用某个约束所不允许的类型来实例化类,则会产生编译时错误。...下面是摘自MSDN的表格: 约束 说明 T:strut 类型参数必须是值类型。 可以指定除 Nullable 以外的任何值类型。 ...T: 类型参数必须是指定的接口或实现指定的接口。 可以指定多个接口约束。 约束接口也可以是泛型的。 T:U 为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。...于是,我想能不能写一个简单的泛型类,其中里面实现对数值类型的加减乘除四则运算,遇到的问题是 :where子句后面的约束怎么写,我查看的数值型的类Int32等等,它们的基类是Object,如果直接定义一个泛型参数
在泛型约束中使用类型参数概述一个泛型被另一个泛型约束, 就叫做 泛型约束中使用类型参数博主需求: 定义一个函数用于根据指定的 key 获取对象的 value:let getProps = (obj: object..., key: string): any => { return obj[key];}如上的代码在编译器当中是会报错的,报错的原因就是它不知道 obj[key] 返回的到底是不是 any 这个类型,...这个错其实可以不用管,如果要想解决这个错误可以利用 interface 来解决,我可以先给出利用 interface 解决这个错误的代码:interface KeyInterface { [key...obj: KeyInterface, key: string): any => { return obj[key];}但是呢,我这里先不解决这个错,一会呢,这个错误就会不见了,首先直接运行看看,是可以运行的...在泛型约束中使用类型参数 来解决该问题,代码如下:图片let getProps = (obj: T, key: K): any => { return
文章目录 一、可变参数 vararg 关键字与泛型结合使用 二、使用 [] 运算符获取指定可变参数对象 一、可变参数 vararg 关键字与泛型结合使用 ---- 如果 泛型类型 T 的参数 是 vararg...可变参数 , 则在接收 可变参数 时 , 需要使用 Array 类型 的变量进行接收 ; 参数为 vararg 可变参数 , 那么可以传入多个 指定类型的 实例对象 ; 在下面的代码中..., 声明了 泛型参数 T , T 类型不必须是 Weapon 类的子类类型 ; 在 Soldier 的主构造函数中 , 传入了 泛型 T 类型的 可变参数 对象 ; 如果要使用 成员属性 接收该 泛型...T 类型的 可变参数 对象 , 则必须 使用 Array 类型对象进行接收 ; 代码示例 : class Soldier(vararg _items: T) {...二、使用 [] 运算符获取指定可变参数对象 ---- 如果想要 使用 [] 运算符获取指定可变参数对象 , 就需要 重写 该类 的 get 函数 进行 运算符重载 ; 如果想要通过 Soldier 实例对象
文章目录 一、匿名函数变量类型推断 二、匿名函数参数类型自动推断 三、Lambda 表达式 一、匿名函数变量类型推断 ---- 定义变量 时 , 如果将变量值 直接赋值给该变量 , 那么就可以 不用显示声明该变量的类型...函数类型 变量的值 ; 下面的代码中的 函数类型 : ()->String 可以省略 , 由 类型推断 来确定 helloFun 只读变量的值 ; val helloFun: ()->String...name = "Tom" "Hello World, $name" } println(helloFun()) } 二、匿名函数参数类型自动推断 ---- 如果 需要...使用 自动类型推断 确定 匿名函数 的 参数类型 , 则在 匿名函数 的 函数体中 , 必须 显示声明 匿名函数 的 变量名 和 变量类型 ; 匿名函数 返回值 类型 , 是根据 匿名函数 函数体 中...参数类型 , 这样就可以使用 类型推断 , 自动推断出 匿名函数 的参数类型 ; 该匿名函数 函数体 最后一行表达式 的 类型 是 String 类型 , 其 返回值类型就是 String 类型 ;
方法相关 参数: string数组 - 全部要比较的字段名称 bool数组 - 每一个字段升序排序还是降序排序 IList集合 - 要排序的List 内部实现; 通过反射找到全部string...使用方法 如Main函数中的使用,传入参数,调用IListSort类中的Sort方法,得到的传入的list就会进行排序。
值 规则 ID CA1005 类别 设计 修复是中断修复还是非中断修复 重大 原因 外部可见的泛型类型具有两个以上的类型参数。 默认情况下,此规则仅查看外部可见的类型,但这是可配置的。...规则说明 泛型类型包含的类型参数越多,越难以知道并记住每个类型参数各代表什么。...它通常有一个类型参数,如在 List 中,而在某些情况下有两个类型参数,如在 Dictionary 中。...以易于理解和使用的语法提供泛型,可减少学习所需的时间,并增加新库的采用率。...CA1000:不要在泛型类型中声明静态成员 CA1002:不要公开泛型列表 CA1003:使用泛型事件处理程序实例 另请参阅 泛型
领取专属 10元无门槛券
手把手带您无忧上云