Kotlin in out
十分简单,定义三个继承关系的类,KtFather KtSon Grandson
转换时子类可以转换成父类,在下面可以看到
class TestInOut : InterfaceIn<KtSon>, InterfaceOut<KtSon> {
override fun add(t: KtSon) {
}
override fun get(): KtSon {
return KtSon()
}
}
interface InterfaceIn <in T>{
fun add(t:T)
}
interface InterfaceOut <out T>{
fun get():T
}
fun main(args: Array<String>) {
// TestInOut().add(KtFather())//错误 Cast Exception KtFather to KtSon
TestInOut().add(Grandson())
// var kt: Grandson = TestInOut().get()//错误 Cast Exception KtSon to Grandson
var kt1: KtFather = TestInOut().get()
}
字节码转码后
可以看到,在转成java的字节码,其实是有强转的。
因此,in可以添加子类,不能添加父类
而out返回可以为父类,不能前传为子类
并且
在in修饰的时候,作为返回值是报错的,因为in描述的作为消费者,是不能返回这个通配符
同样,
当out描述作为生产者也是不能作为参数类型 传递。
结论
in修饰的返回类型不能为通配符T,
out修饰的不能作为参数类型,
并且,in可以添加子类,不能添加父类
而out返回可以为父类,不能前传为子类