非常简单的测试代码:
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
,就像我一样,投射CharSequence
到Editable
,有什么不同吗?
答案 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只允许您转换为值实际支持的类型 - 即值引用的对象的继承层次结构中的某种类型。