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)非常相似,但使用星号投影更加安全。