我有以下情况。
我的对象的基类。
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>
。