使用站点差异类似于Java通配符:
投影外:
val takeList : MutableList<out SomeType> = ... // Java: List<? extends SomeType> val takenValue : SomeType = takeList[0] // 好的,因为上限是SomeType takeList.add(takenValue) // 错误,未指定泛型的下限
投影中:
val putList : MutableList<in SomeType> = ... // Java: List<? super SomeType> val valueToPut : SomeType = ... putList.add(valueToPut) // 好的,因为下界是SomeType putList[0] // 该表达式的类型为Any,因为未指定上限
星状投影
val starList : MutableList<*> = ... // Java: List<?> starList[0] // 该表达式的类型为Any,因为未指定上限 starList.add(someValue) // 错误,未指定泛型的下限
也可以看看:
从Java调用Kotlin时,泛型泛型互操作性。