为什么List <SuperClass>对象可以强制转换为子类对象?

Oph*_*ahn 3 java compiler-errors

我发现,情况1和情况3可以没有错误地进行编译,但是可以进行情况2。(SubClassB扩展了SuperClassA,这是抽象类)我想知道的是,为什么情况1和情况3没有编译错误。如果是JDK错误,为什么情况2无法通过强制转换检查?

// case 1        
List<SuperClassA> a = new ArrayList<>();
SubClassB b = (SubClassB) a; 

// case 2
List<Number> m = new ArrayList<>();
Long n = (Long) m; //Error:(xx,yy) java: incompatible types: java.util.List<java.lang.Number> cannot be converted to java.lang.Long

// case 3
List<Exception> e = new ArrayList<>();
RuntimeException d = (RuntimeException) e;
Run Code Online (Sandbox Code Playgroud)

Pet*_*rey 5

对于不安全的强制类型转换,您会得到警告,因为编译器无法计算出是否应允许这种强制类型转换。(在较旧的Java版本中允许在没有警告的情况下使用,因此现在很难删除)

注意:Long是一个final类,它假定无法存在Long该强制转换可能工作的子类。

您可以创建一个像

class MyException extends RuntimeException implements List<Exception> {
Run Code Online (Sandbox Code Playgroud)

所以这些是有效的代码行

List<Exception> e = new MyException();
RuntimeException d = (RuntimeException) e; // ok.
Run Code Online (Sandbox Code Playgroud)