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

DsC*_*Cpp 3 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);
        }
    }
}
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无关(完全与整数无关),那么为什么演员如何工作呢?

Era*_*ran 6

首先,你的问题的标题是错误的 - 你不是在两个类之间进行投射 - 你正在构建一个表达式,其类型是类类型的接口类型.

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

Integer不能是子类(这是一个final类),所以将永远不会成为一个子类的Integer实现A1.由于强制转换永远不会成功,编译器不允许它.