我想知道下面的代码是如何工作的。我认为它投了A< T>输入到A< S扩展T>,这不应该起作用,例如,你不能用A<数>到A<整数取代。但是调用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();
}
答案 0 :(得分:1)
缺点是Java使用类型擦除实现泛型,并允许您回退到原始类型(pre-generics)以实现向后兼容性,因此允许 不安全的转换。它们带有警告,并且可能在运行时导致ClassCastExceptions,但在某些情况下它们也可以合法使用,所以它是允许的。