Kotlin泛型不会编译

时间:2018-03-05 18:07:52

标签: kotlin

一直困扰着一个问题。这段代码不会编译。我在第4行Type mismatch, found B require typeA收到错误,即使B属于typeA。我找到了一种通过将B投射到typeA来解决这个问题的方法,但这似乎是一种可怕的方式(未经检查的演员)来做到这一点。将返回类型更改为A<C>也会起作用。我猜智能演员不够聪明?

class Test<typeA : A<C>> {

    fun returnB(): typeA {
        return B()
    }
}


open class A<c : C>

class B : A<C>()

open class C

1 个答案:

答案 0 :(得分:2)

您的代码在概念上不正确。

声明Test<typeA : A<C>>表示typeA可以假设其中一种类型为A<C>的子类型。它可能是B,也可能不是B(),如果不是,A不是返回的有效值。例如,您可以声明另一个Test子类型并使用class D : A<C>() val testD = Test<D>() val result = testD.returnB() // the result should be D, since testD has D for its typeA

fun returnB(): typeA

然后,typeA应为每个可能的typeA返回B的值,而不仅仅是typeA的情况。上面的示例将D替换为B,从而表明从testD.returnB()返回{{1}}将是不正确的。