两个可能不相关的类之间的Java转换

时间:2017-02-13 13:00:38

标签: java casting

我正在尝试理解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无关(完全与整数无关),那么为什么演员如何工作?

1 个答案:

答案 0 :(得分:6)

首先,你的问题的标题是不正确的 - 你没有在两个类之间进行投射 - 你正在构建一个类型是类类型的接口类型的表达式。

test.get(0)A1类型的接口。即使A2没有实现该接口,A2的某些子类也可以实现接口(实际上你定义了这样一个类 - A3),所以演员可以成功。因此编译器允许它。

Integer不能被细分(它是最后一堂课),所以不会成为实现Integer的{​​{1}}的子类。由于演员阵容永远不会成功,编译器也不会允许它。