从实例到界面的强制转换是禁止的?

时间:2012-02-11 11:50:46

标签: java android interface casting

非常简单的测试代码:

interface Base {
    void interfaceTest();
    static final String m = "1";
}

interface Child extends Base {
    void interfaceTestChild();
}

class BaseClass implements Base {
    @Override
    public void interfaceTest() {
        System.out.println("BaseClassInterfaceTest");
    }
}

class ChildClass implements Child {

    @Override
    public void interfaceTest() {
        System.out.println("ChildClassInterfaceTest");
    }

    @Override
    public void interfaceTestChild() {
        System.out.println("interfaceTestChild");

    }
}

public class Src {
    public Child testFunc() {
        Base x = new BaseClass();
        return (Child)x;      <==Here got an "ClassCastException"
    }

    public static void main(String args[]) {
        Src testSrcInstance = new Src();
        testSrcInstance.testFunc().interfaceTest();
    }
}

return (Child)x;行中,我遇到了“ClassCastException”,我对此感到非常困惑,Child扩展Base,因此x应转换为{{ 1}}成功。这种对话是由一些android代码模仿的:

Child的{​​{1}}方法是:

getText()

EditText的超类是public Editable getText() { return (Editable) super.getText(); } ,其中EditText方法是:

TextView

mText是getText(),请注意,Editable扩展了CharSequence,所以你可以看到,这些android代码将public CharSequence getText() { return mText; } 投射到CharSequence,就像我一样,投射CharSequenceEditable,有什么不同吗?

1 个答案:

答案 0 :(得分:4)

  

在行返回(Child)x;我得到了一个“ClassCastException”,我对此感到非常困惑,因为Child扩展了Base,所以x应该成功转换为Child。

不,它只有在x *实际引用实现Child的某种类型的实例时才有效。在这种情况下,它不会 - 它只引用BaseClass的实例。这并没有为interfaceTestChild()指定任何行为,那么如果您能够调用它会发生什么?

Base x = new BaseClass();
// Imagine this had worked...
Child child = (Child)x;
// What would this do? There's no implementation!
child.interfaceTestChild();

Java只允许您转换为值实际支持的类型 - 即值引用的对象的继承层次结构中的某种类型。