为什么允许将Parent类转换为Child类中定义的接口,如果它没有实现它,没有错误也没有警告?

时间:2018-02-09 11:48:57

标签: java exception casting

在阅读Android Fragment Callback接口时,我注意到有可能将Parent类对象转换为其子类体中定义的Interface,而不会出现错误甚至编译器发出警告。如果Parent类实现Interface以防止这种类型的转换,那么编译时信息不是那种情况吗?这是显示我的意思的代码:

class Parent {}

public class Child extends Parent {

    private InterfaceInChild iface;

    public interface InterfaceInChild {
        void foo();
    }

    public void checkCasting(Parent parent) {
        iface = (InterfaceInChild) parent; // no warning, no error
    }

    public static void main(String[] args) {
        Child c = new Child();
        c.checkCasting(new Parent()); // throws exception
    }
}

这是运行该代码时抛出的异常:

Exception in thread "main" java.lang.ClassCastException: Parent cannot be cast to Child$InterfaceInChild
    at Child.checkCasting(Child.java:13)
    at Child.main(Child.java:18)

PS。当然,它不是Android回调接口中使用的代码,我更改了类或方法的名称,并删除了没有必要清楚什么是重要的。

0 个答案:

没有答案