为简化起见,我有两个类:
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强制转换为不属于它的孩子的方式。我错过了什么,或者我可以压制警告吗?
答案 0 :(得分:1)
警告是正确的。因为你可以用这样的邪恶参数填充泛型参数:
class ClassC : ClassA<ClassB>()
现在,您只需拨打ClassCastException
上的fooA
即可生成ClassC
:
fun main(args: Array<String>) {
val fooA = ClassC().fooA()
}
这就是fooA
不安全的原因。
在编译时无法检测到这种错误,这就是警告的原因。
当然,您可以手动确保您的代码没有以错误的方式填充通用参数并禁止警告。