【问题标题】:Cast from instance to interface is banned?禁止从实例转换到接口?
【发布时间】:2012-02-11 11:50:45
【问题描述】:

非常简单的测试代码:

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 应该成功转换为Child。这种对话被一些android代码模仿:

EditTextgetText()方法是:

public Editable getText() {
        return (Editable) super.getText();
    }

EditText的超类是TextView,其中getText()方法是:

public CharSequence getText() {
    return mText;
}

mText 是一个CharSequence,注意Editable 扩展了CharSequence,所以你可以看到,这些android 代码将CharSequence 转换为Editable,就像我一样,将Base 转换为Child,有什么区别吗?

【问题讨论】:

    标签: java android interface casting


    【解决方案1】:

    在行中返回 (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 只允许您转换为该值实际支持的类型 - 即该值所引用的对象的继承层次结构中的某种类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-22
      • 2015-02-23
      • 2011-04-19
      • 2019-11-21
      • 2011-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多