我在科特林发现了一种奇怪的行为。给定此代码:
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无法进行类型推断,并猜测aPage<Owl>
也是a Page<Animal>
。
有人可以给我提示,可能还有一些解决方法吗?
在您的示例中,error()函数返回不变的Page <Animal>,因此它必须是Page <Animal>对象:而不是Page <Owl>。您应该添加out
到泛型以使其协变,因此固定实现为:
fun error(): Page<out Animal> {
val list = listOf(
Owl()
)
val page: Page<Owl> = Page(list)
return page
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句