2017-05-13 11 views
-1
interface MyInterface { 

     public List<String> getNames(); 
} 

class MyClass implements MyInterface { 

    @Override 
    public List<String> getNames() { 
     ... 
     return names; 
    }  
    public List<String> getTypes() { 
      ... 
      return types; 
    } 
} 

class MyClassFactory { 

    public MyInterface create() { 
     ... 
     MyInterface myClass = new MyClass(); 
     return myClass; 
    } 
} 

public class MyClient { 

    MyInterface myClass = myClassFactory.create(); 
    List<String> types = myClass.getTypes(); 
} 

このコードでは、最後の行「List types = myClass.getTypes();このメソッドはクラスに対して定義されていません。何故ですか?これは、多態的な振る舞いを使う正しい方法ではありませんか?Javaインタフェースを含む多態的な振る舞い

+0

'のあなたはインタフェースで' getTypes'を定義していないので、あなたは、暗黙的にインターフェイスにキャスト後が表示されていません。 – 4castle

+0

'myClass'は' MyInterface'のインスタンスで、 'getTypes()'関数を見ることができません。それをあなたのクラスにキャストしようとするかもしれません。 'リストタイプ=((MyClass)myClass).getTypes();' –

答えて

2

これは、多態性の動作を使用する正しい方法ではありませんか?

インターフェイスに定義されたメソッドgetNames()を呼び出した場合、これはインターフェイスへのプログラミングに最適な方法です。ただし、getTypes()はクラスでのみ定義されますが、インターフェイスでは定義されません。コンパイラはこの情報を使用できないため、エラーが発生しています。

getTypes()をインターフェイスに追加するか、またはmyClassのコンパイル時のタイプをMyClassに変更することでこれを修正できます。

0

"public List getTypes();"あなたのMyClientというクラス使用中のMyInterface.Orで

MyClass myClass = (MyClass) myClassFactory.create(); 

このラインの代わりに

MyInterface myClass = myClassFactory.create(); 
関連する問題