在Kotlin中,如何从字符串中获取一个类并将其分配给具有超类类型的变量?

时间:2019-12-24 09:49:20

标签: kotlin

现在我正在使用以下行: klass = Class.forName({MyClassName}).kotlin as KClass<{MySuperClassName}>

但是我收到“未经检查的演员”警告

有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

我看不到一种避免这种警告的方法,因为.kotlin<T : Any> Class<T>的扩展,而这正是Class.forName()返回的内容(从Java转换时)。因此,您实际上正在执行以下操作:

Class.forName() -> Class<T: Any>.kotlin -> KClass<T: Any> as KClass<{MySuperClassName}>

您将KClass<T: Any>强制转换为KClass<{MySuperClassName}>,这将始终产生警告,因为编译器无法确定MySuperClassName实际上是否是T的后代,因为{ {1}}可以是任何东西。

答案 1 :(得分:0)

此演员表实际上是不正确的; Class<{MyClassName}>不是 一个Class<{MySuperClassName}>。它不会引发异常,因为如警告所述,强制转换未选中。您可能想要的类型是Class<out {MySuperClassName}>(基本上就是Class<some subtype of {MySuperClassName}>)。

修正此类型将无法解决警告,原因是Codesalot爵士的回答中已经说明了原因。

但是您可以suppress the warning@Suppress("UNCHECKED_CAST")一起使用,因为没有,没有更好的方法。