从类中抛出的伪造生成错误,而从界面抛出(虚假)则不会?

时间:2011-10-06 19:26:54

标签: java casting

    // Casting of class
    ArrayList a1 = new ArrayList<Integer>();
    Number n1 = (Number)a1; // clause 1 Error 
    AdjustmentListener c1 = (AdjustmentListener)a1; // Clause 2 No error
    EventListener c3 = (EventListener)a1; // Clause 3 No error

基于以上所述,第1条有错误。逻辑。这两个班级之间没有关系。对于第2节,arrayList(类)和adjustlistener接口之间没有关系。为什么没有错误?

编辑1:

    String str1 = new String();
    AdjustmentListener c2 = (AdjustmentListener)str1; // clause 4 compiler error

4 个答案:

答案 0 :(得分:1)

编译器知道ArrayList永远不能是Number,因为在Java中你只能从一个超类继承。它无法知道是否没有实现List的类型并从Number继承,即您可以成功地将以下类型的值转换为List和Number:

class ListNumber extends Number implements List {
    ....
}

答案 1 :(得分:1)

我相信在这种情况下你会感到困惑,因为a1是一个ArrayList而l1是使用ArrayList作为interface的List implementation。 List允许您进行特定的转换,但ArrayList不允许。在这种特殊情况下,您无法在引用实现时进行强制转换,但在引用接口时可以进行强制转换。

答案 2 :(得分:0)

为了使演员成功,必须有一些可能的两个参数的实现者。例如,假设以下虚构的类声明:


5: class ComparableArrayList extends ArrayList implements Comparable
7: class NumberList extends Number implements List
8: class ComparableList implements Comparable, List
每个实例都允许演员成功。对于第4条,为了使演员工作,您需要

class NumberArrayList extends ArrayList, Number
和Java不允许多重继承。

编辑问题

编辑

在第1节中,类之间没有可能的关系,因为您不能让类扩展ArrayList和Number。在第2和第3节中,可以通过创建扩展ArrayList并实现AdjustmentListener的新类来创建关系。然后将a1设置为该类的实例。

答案 3 :(得分:0)

如果从带有 class 结果类型的表达式伪造,则编译器知道 因此它拒绝编译时出现编译时错误。 (更改类扩展或实现的是一个突破性的变化:为了避免奇怪的运行时异常,应该针对新的类结构重新编译代码。)

但是,当从带有 interface 结果类型的表达式进行转换时,编译器不能(通常)确定转换将永远不会有效(但考虑{{1 }););因此没有编译错误。但是,当尝试虚假演员时,会有一个运行时异常。

想象一下这个小小的可编辑示例(请注意泛型与帖子无关):

final

快乐的编码。