未经检查的泛型 class 类型 IDE 警告
Unchecked cast of generic class type IDE warning
为了简单起见,我有这两个 类:
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 中的 return 类型不可能不是 ClassA 的子级,这意味着转换检查将是多余的。或者至少我看不到 fooA 可以尝试将 ClassA 转换为不是它的子对象的方法。我是不是遗漏了什么,或者我可以取消警告吗?
警告是正确的。因为您可能会用这样的邪恶参数填充通用参数:
class ClassC : ClassA<ClassB>()
现在您只需在 ClassC
上调用 fooA
即可生成 ClassCastException
:
fun main(args: Array<String>) {
val fooA = ClassC().fooA()
}
这就是 fooA
不安全的原因。
编译时无法检测到此类错误,这就是出现警告的原因。
当然,您可以手动确保您的代码不会以错误的方式填充通用参数并取消警告。
为了简单起见,我有这两个 类:
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 中的 return 类型不可能不是 ClassA 的子级,这意味着转换检查将是多余的。或者至少我看不到 fooA 可以尝试将 ClassA 转换为不是它的子对象的方法。我是不是遗漏了什么,或者我可以取消警告吗?
警告是正确的。因为您可能会用这样的邪恶参数填充通用参数:
class ClassC : ClassA<ClassB>()
现在您只需在 ClassC
上调用 fooA
即可生成 ClassCastException
:
fun main(args: Array<String>) {
val fooA = ClassC().fooA()
}
这就是 fooA
不安全的原因。
编译时无法检测到此类错误,这就是出现警告的原因。
当然,您可以手动确保您的代码不会以错误的方式填充通用参数并取消警告。