现在我正在使用以下行:
klass = Class.forName({MyClassName}).kotlin as KClass<{MySuperClassName}>
但是我收到“未经检查的演员”警告
有更好的方法吗?
答案 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")
一起使用,因为没有,没有更好的方法。