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)
对于不安全的强制类型转换,您会得到警告,因为编译器无法计算出是否应允许这种强制类型转换。(在较旧的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)