一直困扰着一个问题。这段代码不会编译。我在第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
答案 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}}将是不正确的。