当前位置:嗨网首页>书籍在线阅读

10-星号投影

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

8.2.5 星号投影

有时候,我们对于类型参数的信息一无所知,但仍希望安全地使用它,为此Kotlin提供了星号投影。此处的安全指定义泛型投影的类型,每个泛型的具体实例就是泛型的子类型。Kotlin提供的星号投影语法如下。

  • 对于类型Foo\,T为上界TUpper的协变量,Foo<>等价于Foo\。这意味着,当T类型未知时,可以安全地读取Foo<>中Tupper类型的值。
  • 对于类型Foo\,T为逆变类型参数,Foo<>等价于Foo\,这意味着,当T类型未知时不能安全地向Foo<>中写入任何东西。
  • 对于类型Foo\,T为不可变类型参数,带有上界TUpper,对于读取值的场合,Foo<>等价于Foo\;对于写入值的场合,Foo<>则等价于Foo\

如果泛型中存在多个类型参数,则每个类型参数都可以独立投影。例如,类型声明为interface Function<in T, out U>时,可以出现以下几种星号投影。

  • Function<*, String>:表示Function<in Nothing, String>。
  • Function<Int, *>:表示Function<Int, out Any?>。
  • Function<, >:表示Function<in Nothing, out Any?>。

从上面的示例可以看出,星号投影和Java的原始类型(raw type)非常相似,但使用星号投影更加安全。