java,从A <t>转换为A <s extends =“”t =“”> </s> </t>

时间:2015-03-16 03:07:43

标签: java generics casting

我想知道下面的代码是如何工作的。我认为它投了A&lt; T&GT;输入到A&lt; S扩展T>,这不应该起作用,例如,你不能用A&lt;数&GT;到A&lt;整数取代。但是调用A.returnB()只会导致警告:未经检查或不安全的操作。

class A<T>{
    public static <S extends Number> A<S>  returnB(){
    return (A<S>) B.INSTANCE;
    }
}

class B extends A<Number>{
    static final B INSTANCE = new B();
}

1 个答案:

答案 0 :(得分:1)

缺点是Java使用类型擦除实现泛型,并允许您回退到原始类型(pre-generics)以实现向后兼容性,因此允许 不安全的转换。它们带有警告,并且可能在运行时导致ClassCastExceptions,但在某些情况下它们也可以合法使用,所以它是允许的。