我试图理解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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这段代码编译,但如果我改变
A2 a2 = (A2) test.get(0);
Run Code Online (Sandbox Code Playgroud)
至
A2 a2 = (Integer) test.get(0);
Run Code Online (Sandbox Code Playgroud)
它给出了编译错误.
类型不匹配:无法从Integer转换为SampleTester.A2
在我看来,A2与A1无关(完全与整数无关),那么为什么演员如何工作呢?
首先,你的问题的标题是错误的 - 你不是在两个类之间进行投射 - 你正在构建一个表达式,其类型是类类型的接口类型.
test.get(0)是类型A1,接口.即使A2没有实现该接口,一些子类A2可能实现了接口(实际上你定义了这样一个类 - A3),因此转换可以成功.因此编译器允许它.
Integer不能是子类(这是一个final类),所以将永远不会成为一个子类的Integer实现A1.由于强制转换永远不会成功,编译器不允许它.
| 归档时间: |
|
| 查看次数: |
101 次 |
| 最近记录: |