java,从 A<T> 转换为 A<S extends T>

java, cast from A<T> to A<S extends T>

我想知道下面的代码是如何工作的。我认为它将 A 类型强制转换为 A,这应该不起作用,例如,您不能将 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();
}

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