【问题标题】:Java casting between two presumably unrelated classes两个可能不相关的类之间的 Java 转换
【发布时间】:2017-02-13 13:00:38
【问题描述】:

我试图了解 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 没有任何关系(正如整数不相关),那么强制转换是如何工作的呢?

【问题讨论】:

    标签: java casting


    【解决方案1】:

    首先,您的问题标题不正确-您不是在两个类之间进行转换-您是将类型为接口类型的表达式转换为类类型。

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

    Integer 不能被子类化(它是最终类),因此永远不会有实现 A1Integer 的子类。由于强制转换永远不会成功,因此编译器不允许这样做。

    【讨论】:

    • 很好的答案,谢谢。在您回答之后,我意识到即使在使用“扩展 A2”之后它也会编译,这意味着(如果我错了,请纠正我)编译器不需要看到真正的层次结构连接,只是一个潜在的。
    猜你喜欢
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多