Очень простой код для теста:
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:
getText()
метод EditText
- это:
public Editable getText() {
return (Editable) super.getText();
}
, а суперкласс EditText
- TextView
,из которых getText()
метод:
public CharSequence getText() {
return mText;
}
mText является CharSequence
, и обратите внимание, что Editable расширяет CharSequence, так что вы можете видеть, эти коды Android приводят CharSequence
к Editable
, простокак я, приведи Base
к Child
, какая разница?