-
概念含义
-
in关键字(逆变)
- 在Kotlin泛型中,
in
关键字主要用于定义逆变(Contravariance)。它表示一个泛型类型参数可以是指定类型或者它的超类型。简单来说,就是对于类型A
和B
,如果A
是B
的子类型,那么Consumer<B>
是Consumer<A>
的子类型。这里的Consumer
是一个具有in
关键字修饰泛型参数的类型,例如接口或者类。
- 在Kotlin泛型中,
-
out关键字(协变)
-
out
关键字用于定义协变(Covariance)。它意味着一个泛型类型参数可以是指定类型或者它的子类型。也就是说,对于类型A
和B
,如果A
是B
的子类型,那么Producer<A>
是Producer<B>
的子类型。这里的Producer
是一个带有out
关键字修饰泛型参数的类型,像接口或者类。
-
-
in关键字(逆变)
-
使用场景和位置限制
-
in关键字
-
主要用于函数参数类型:
in
关键字在泛型类型参数用于函数参数时体现逆变特性。例如,考虑一个函数接口AnimalHandler<in T>
,其中T
是用in
修饰的泛型参数。interface AnimalHandler<in T> { fun handle(animal: T): Unit }
- 假设
Dog
是Animal
的子类型。那么一个AnimalHandler<Animal>
类型的变量可以接收一个AnimalHandler<Dog>
类型的值,因为AnimalHandler
在in
位置(函数参数位置)是逆变的。val animalHandler: AnimalHandler<Animal> = object : AnimalHandler<Dog> { override fun handle(dog: Dog): Unit { println("Handling a dog") } }
-
不能用于返回值类型:如果在应该返回
T
(in
修饰的泛型参数)的地方使用,会导致编译错误。因为in
规定这个类型参数主要用于接收超类型的值,而不是返回子类型的值。
-
主要用于函数参数类型:
-
out关键字
-
主要用于函数返回值类型:
out
关键字在泛型类型参数用于函数返回值时体现协变特性。例如,有一个接口Producer<out T>
,它用于产生某种类型T
的对象。interface Producer<out T> { fun produce(): T }
- 假设
String
是Any
的子类型。一个Producer<String>
可以被当作Producer<Any>
来使用,因为Producer
在out
位置(函数返回值位置)是协变的。val producer: Producer<Any> = object : Producer<String> { override fun produce(): String { return "Hello" } }
-
不能用于函数参数类型:如果试图将
out
修饰的泛型参数用于函数参数,编译器会报错。因为out
规定这个类型参数主要用于返回子类型的值,而不是接收子类型的值作为参数。
-
主要用于函数返回值类型:
-
in关键字
-
目的和效果
-
in关键字的目的和效果
- 目的是实现更灵活的函数参数类型匹配,特别是在处理超类型和子类型关系时。它允许在一个更通用的类型(超类型)的消费者(如接口方法接收超类型参数)中使用更具体的类型(子类型)的实现。这样可以使代码在处理函数参数时,能够以一种逆变的方式利用类型层次结构,增强代码的通用性和灵活性。
-
out关键字的目的和效果
- 主要目的是在处理返回值类型时,能够利用协变特性,使得代码更加灵活。通过允许子类型的生产者(如接口方法返回子类型的值)可以被当作更通用类型(超类型)的生产者来使用,方便在不同层次的类型之间进行转换和赋值,同时保证类型安全。这在构建具有多态性的返回值类型的接口和类时非常有用,可以让调用者以更灵活的方式处理返回值。
-
in关键字的目的和效果
kotlin中泛型中in和out的区别
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- ? 和 T 是什么? ? 是通配符(wildcard,记住这个单词,这样在报错时就知道说的是 ? 通配符),T 是...
- 参考: Kotlin 实战 Java 泛型推荐阅读:https://www.zhihu.com/question/...