在一个问题上停留了很长时间。这段代码将无法编译。即使Type mismatch, found B require typeA
是B
,我在第4行typeA
上也遇到错误。我找到了一种通过将B
转换为typeA
来解决此问题的方法,但这似乎是一种可怕的方法(未经检查的强制转换)。将返回类型更改为A<C>
也会起作用。我猜聪明的 Actor 还不够聪明?
class Test<typeA : A<C>> {
fun returnB(): typeA {
return B()
}
}
open class A<c : C>
class B : A<C>()
open class C
最佳答案
您的代码在概念上是错误的。
声明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()
是不正确的。
关于kotlin - Kotlin泛型无法编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49116823/