Generics 泛型类类型IDE警告的未选中强制转换
为了简化,我有以下两个类:Generics 泛型类类型IDE警告的未选中强制转换,generics,inheritance,casting,kotlin,warnings,Generics,Inheritance,Casting,Kotlin,Warnings,为了简化,我有以下两个类: 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 {
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
}
}
抽象类ClassA,其中T:ClassA{
fun fooA():T{
//做事
以T/的形式返回此值,警告是正确的。因为您可能会用如下错误参数填充泛型参数:
class ClassC : ClassA<ClassB>()
这就是为什么fooA
是不安全的
这种错误在编译时无法检测到,这就是为什么会出现警告的原因
当然,您可以手动确保您的代码没有以错误的方式填充泛型参数并抑制警告。问得好。这显示了Java(以及Kotlin)类型系统的弱点。typeclass
解决了这个问题。啊,我现在看到了这个问题。但是您不能进行类型检查泛型(这对这个问题没有帮助)。是否手动确保我不会使这些泛型类型错误成为合理的路径?或者您知道是否有已知的解决方案来解决此问题?这显示了Java(以及Kotlin)类型系统的弱点。typeclass
(语言功能,Haskell/Scala有此功能)解决这个问题。看看哪一个正在寻找类似的东西。
fun main(args: Array<String>) {
val fooA = ClassC().fooA()
}