【发布时间】:2020-03-19 02:14:32
【问题描述】:
我在 kotlin 中发现了一个奇怪的行为。鉴于此代码:
interface Animal
class Owl : Animal
class Page<T>(var list: List<T>)
fun ok(): List<Animal> {
val list = listOf(
Owl()
)
return list
}
fun error(): Page<Animal> {
val list = listOf(
Owl()
)
val page: Page<Owl> = Page(list)
return page
}
猫头鹰实现动物。第一个函数编译,但在第二个函数中,我得到了错误:
Type mismatch.
Required: Page<Animal>
Found: Page<Owl>
我不明白为什么 kotlin 不能进行类型推断并猜测 Page<Owl> 也是 Page<Animal>。
有人可以给我这方面的建议吗?可能还有一些解决方法?
【问题讨论】:
-
Page的类型参数是不变的。您必须将out添加到其类型参数以使其具有协变:class Page<out T>(var list: List<T>)。 -
并且
List已经在其声明中定义为具有协变类型。所以List<Animal>的含义与List<out Animal>完全相同。这就是它与 List 一起使用的原因。 -
但是因为
list的setter不能协变。