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
}