【问题标题】:Kotlin type mismatch, genericsKotlin 类型不匹配,泛型
【发布时间】: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&lt;Owl&gt; 也是 Page&lt;Animal&gt;

有人可以给我这方面的建议吗?可能还有一些解决方法?

【问题讨论】:

  • Page 的类型参数是不变的。您必须将out 添加到其类型参数以使其具有协变:class Page&lt;out T&gt;(var list: List&lt;T&gt;)
  • 并且List 已经在其声明中定义为具有协变类型。所以List&lt;Animal&gt; 的含义与List&lt;out Animal&gt; 完全相同。这就是它与 List 一起使用的原因。
  • 但是因为list的setter不能协变。

标签: generics kotlin


【解决方案1】:

在您的示例中,error() 函数返回不变的 Page,因此它必须是 Page 对象:而不是 Page 对象。您应该将out 添加到泛型以使其协变,因此固定实现是:

fun error(): Page<out Animal>  {
    val list = listOf(
        Owl()
    )

    val page: Page<Owl> = Page(list)

    return page
}

【讨论】:

    猜你喜欢
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多