我正在尝试理解java编译器如何处理类型转换,但我无法弄明白。
请参阅以下代码
public class SampleTester{
public static interface A1{}
public static class A2{}
public static class A3 extends A2 implements A1{
public static void main(String[] args){
List<A1> test = new ArrayList<>();
test.add(new A3());
A2 a2 = (A2) test.get(0);
}
}
}
此代码编译,但如果我更改
A2 a2 = (A2) test.get(0);
到
A2 a2 = (Integer) test.get(0);
它给出了编译错误。
类型不匹配:无法从Integer转换为SampleTester.A2
在我看来,A2与A1无关(完全与整数无关),那么为什么演员如何工作?
答案 0 :(得分:6)
首先,你的问题的标题是不正确的 - 你没有在两个类之间进行投射 - 你正在构建一个类型是类类型的接口类型的表达式。
test.get(0)
是A1
类型的接口。即使A2
没有实现该接口,A2
的某些子类也可以实现接口(实际上你定义了这样一个类 - A3
),所以演员可以成功。因此编译器允许它。
Integer
不能被细分(它是最后一堂课),所以不会成为实现Integer
的{{1}}的子类。由于演员阵容永远不会成功,编译器也不会允许它。