Generics Kotlin泛型继承如何强制转换到继承的对象
我有以下情况 我的对象的基类Generics Kotlin泛型继承如何强制转换到继承的对象,generics,kotlin,Generics,Kotlin,我有以下情况 我的对象的基类 abstract class A{ lateinit var x: Animal fun defineStuff() { x = Factory().createFor(getAnimalType()) } abstract fun <T: Animal> getAnimalType(): Class<T> } 工厂类是由我的框架提供的。这是签名: fun <T: Animal> createFor(an
abstract class A{
lateinit var x: Animal
fun defineStuff() {
x = Factory().createFor(getAnimalType())
}
abstract fun <T: Animal> getAnimalType(): Class<T>
}
工厂类是由我的框架提供的。这是签名:
fun <T: Animal> createFor(animalType: Class<T>): T
fun createFor(animalType:Class):T
现在我上了以下课程:
class B : A() {
override fun <T: Animal> getAnimalType(): Class<T> {
return Dog::class.java as Class<T>
}
}
B类:A(){
重写getAnimalType():类{
将Dog::class.java作为类返回
}
}
下面一行被我的linter突出显示为“未检查的类”
这是否意味着我做错了什么?有没有更好的方法在Kotlin中使用不会产生警告的泛型?或者我应该忽略它。该类型确实在运行时被擦除。这就是警告的内容 代码的调用者可以执行以下操作:
val b: B = B()
val catClass: Class<Cat> = b.getAnimalType()
valb:b=b()
val catClass:Class=b.getAnimalType()
编译器将允许这样做。代码将在不引发异常的情况下运行
您的基函数不应该是泛型的,它应该有一个返回类型
Class
,该类型确实在运行时被擦除。这就是警告的内容
代码的调用者可以执行以下操作:
val b: B = B()
val catClass: Class<Cat> = b.getAnimalType()
valb:b=b()
val catClass:Class=b.getAnimalType()
编译器将允许这样做。代码将在不引发异常的情况下运行
你的基函数不应该是泛型的,它应该有一个返回类型
Class
实际上,我认为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
}
抽象类A{
lateinit变量x:T
fun defineStuff(){
x=Factory().createFor(getAnimalType())
}
抽象趣味getAnimalType():类
}
类DogA:A(){
重写fun getAnimalType()=Dog::class.java
}
实际上,在我看来,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
}
抽象类A{
lateinit变量x:T
fun defineStuff(){
x=Factory().createFor(getAnimalType())
}
抽象趣味getAnimalType():类
}
类DogA:A(){
重写fun getAnimalType()=Dog::class.java
}