Kotlin 泛型继承如何强制转换为继承的对象



我有以下情况。

我的对象的基类。

abstract class A{
lateinit var x: Animal
fun defineStuff() {
x = Factory().createFor(getAnimalType())
}
abstract fun <T: Animal> getAnimalType(): Class<T>
}

我同时定义了动物和狗:

open class Animal
class Dog : Animal()

工厂类是由我的框架为我提供的。 这是签名:

fun <T: Animal> createFor(animalType: Class<T>): T

现在我做了以下课程:

class B : A() {
override fun <T: Animal> getAnimalType(): Class<T> {
return Dog::class.java as Class<T>
}
}

以下行被我的 linter 突出显示为"未检查的类">

这是否意味着我做错了什么? 有没有更好的方法可以在 Kotlin 中使用不会产生警告的泛型? 或者我应该忽略它。

实际上,在我看来A,更好的解决方案应该是通用的(因为A是抽象的,其中非常重要的事情之一是盒装值的类型(。然后,您可以执行以下操作:

abstract class A<T: Animal> {
lateinit var x: T
fun defineStuff() {
x = Factory().createFor(getAnimalType())
}
abstract fun getAnimalType(): Class<T>
}
class DogA: A<Dog>() {
override fun getAnimalType() = Dog::class.java
}

该类型确实在运行时被擦除。这就是警告的内容。

代码的调用方可以执行以下操作:

val b: B = B()
val catClass: Class<Cat> = b.getAnimalType()

编译器将允许这样做。代码将在不引发异常的情况下运行。

您的基函数不应该是泛型的,它应该具有返回类型Class<out Animal>

最新更新