为了简化,我有以下两个类:
abstract class ClassA<T> where T : ClassA<T> {
fun fooA(): T {
//Do stuff
return this as T //<-- Cast warning happens here
}
}
open class ClassB : ClassA<ClassB>() {
fun fooB(): ClassB {
//Do stuff
return this
}
}
我在fooA函数中标记的那行被IntelliJ标记为以下警告:
"Unchecked cast: ClassA<T> to T"
。除非我丢失了某些东西,否则我使用类设置的方式应该使fooA函数中的返回类型不可能不是ClassA的子代,这意味着强制类型检查将是多余的。或者至少我看不到fooA可以尝试将ClassA强制转换为不是它的子级的某种方法。我是否缺少某些东西,还是可以抑制警告?
最佳答案
警告是正确的。因为您可能会用一个邪恶的参数填充通用参数,如下所示:
class ClassC : ClassA<ClassB>()
现在,您只需在
ClassCastException
上调用fooA
即可生成ClassC
:fun main(args: Array<String>) {
val fooA = ClassC().fooA()
}
这就是
fooA
不安全的原因。在编译时无法检测到此类错误,这就是为什么出现警告的原因。
当然,您可以手动确保代码不会以错误的方式填充通用参数并消除警告。
关于generics - 未经检查的通用类类型IDE警告的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50093346/