Kotlin 使用地点差异

示例

使用站点差异类似于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时,泛型泛型互操作性。