知识卡片

声明处型变与使用处型变的对比

专业/工作 · 79

内容

Kotlin允许在声明泛型接口时用out标注类型参数(声明处型变),表示该参数只被读取(生产)不被写入,编译器据此允许Source<String>安全赋值给Source<Object>in标注则表示只被写入(消费)。这与Java必须在每次使用泛型处手写通配符(如List<? extends Object>)的”使用处型变”不同——类型定义时就声明好协变/逆变意图,调用处自动获得对应安全性,无需每次重新声明。对无法整体声明为协变或逆变的类型(如数组),Kotlin还提供类型投影在具体调用处临时限定读写权限。

参考来源

《Kotlin开发快速入门与实战》第5章《Kotlin面向对象》