generics - 未经检查的通用类类型IDE警告的转换

标签 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 {
        //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/

相关文章:

c# - 将 Expression<Func<T, object>> 通用拆箱为 Expression<Func<T, TResult>>

java - 驯服 Java 泛型中的类型检查器

来自抽象类的 Java 通用子实例

python - 具有不同初始化参数的基类的方法解析顺序

java - 具有构建器模式的通用对象

java - 为什么 HashMap.Entry 不采用其父级的泛型参数?

c# - 具有更严格约束的继承方法?

c++ - 如何向派生类添加功能?

c# - 转换不可空或返回默认值(类型)的常用方法是什么

c++ - 读取和写入结构的填充位