2012-02-11 6 views
0

非常に簡単なコード:行return (Child)x;インスタンスからインターフェイスへのキャストは禁止されていますか?テストのための

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(); 
    } 
} 

私は「ClassCastExceptionが」持って、ChildBaseを拡張し、そうxが正常にChildに変換する必要があるため、私は、それについて非常に混乱を感じます。会話のこの種は、いくつかのAndroidコードで模倣される:EditText

getText()方法は次のとおりです。

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

EditTextのスーパークラスはTextViewあり、getText()方法があるの:

public CharSequence getText() { 
    return mText; 
} 

mTextはCharSequenceであり、CharSequenceを拡張できることに注意してください。これらのアンドロイドコードはCharSequenceからにキャストされています、ちょうど私と同じキャストBaseChild、違いはありますか?

答えて

4

行リターン(子)x;私は "ClassCastException"を得て、私はそれについて非常に混乱していると感じています。

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では、値が実際にサポートしている型にキャストできます。つまり、値が参照するオブジェクトの継承階層の型です。

関連する問題