【问题标题】:Java: Generic casting down generates warning, why?Java:通用强制转换会产生警告,为什么?
【发布时间】:2009-09-07 21:44:22
【问题描述】:

我不明白为什么下面的代码会产生警告。

interface Generic<T> {
}

interface A {
}

class B {
    Generic<A> c;

    <T extends A> B(Generic<T> a) {
        c = (Generic<A>) a; //warning here
    }

}

//Unchecked cast from Generic<T> to Generic<A>

在 B 类中,我只对使用 A 类型的 Generic 实例感兴趣。此警告表明我需要将 Generic 参数存储为 T 而不是 A。

但这意味着我也必须声明 B 泛型,这似乎使事情变得比他们需要的更复杂。

【问题讨论】:

  • 不施放会怎样?

标签: java generics compiler-warnings


【解决方案1】:

这不是向下转换,因为 Java 泛型是不变的:Generic&lt;T&gt; 不是 Generic&lt;A&gt; 的子类型,即使 T 是 A 的子类型。如果您只需要返回 A 的泛型方法,则可以使用通配符Generic&lt;? extends A&gt; 在 B 构造函数和存储引用的字段中。

【讨论】:

    【解决方案2】:

    因为Generic&lt;T&gt; 不是Generic&lt;A&gt; 的子类型,即使TA 的子类型。

    为了说明这一点,请考虑 StringObject 实例:

    List<String> listOfStrings = new ArrayList<String>();
    List<Object> listOfObjects = (List<Object>)listOfStrings; // invalid
    listOfObjects.add(new Date());
    // now listOfStrings contain a date!
    

    编译器不允许这种转换,因为它可能会导致原始列表损坏。 JVM 不会在运行时强制执行通用边界要求。

    这里的解决方案是将字段c类型声明为 “通用”。

    【讨论】:

    • java中泛型危险的经典例子
    猜你喜欢
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-23
    • 1970-01-01
    • 2019-05-06
    相关资源
    最近更新 更多