2010-12-16 6 views
7

シンプルなデザインとシンプルなコードとして認識されないが、コンパイルされません。のJava:コレクション内のインタフェースパラメータ

public interface Insertable { 
    public String getInsertStmt(String table); 
} 

public class ClassCanBeInserted implements Insertable { 
    public String getInsertStmt(String table) {} 
} 

public class SomeClass { 
    public static void main() { 
     List<ClassCanBeInserted> list = new ArrayList<ClassCanBeInserted>(); 
     SomeMethod(list); 
    } 
    private static void SomeMethod(List<Insertable> list) {} 
} 

とのsomeMethod(への呼び出し)がコンパイルされません。英語は貧しいが、コードは説明する必要があります。誰かが何が間違っているのか、インターフェイス実装のクラスのリストをそのようなメソッドで使用できるようにするためのデザインを取得する方法を教えてください。

この場合も、英語は貧弱なので、よく表現されていない可能性があります。あなたの質問を教えてください。ありがとう!

エラーメッセージは、指定された: タイプClassCanBeInsertedのメソッドのsomeMethod(リスト)InsertableClassCanBeInsertedのスーパークラスであっても、List<ClassCanBeInserted>のスーパー引数(リスト)

答えて

13

List<Insertable>には適用されないではありません。あなたがしたいことをするには、SomeMethodの署名をSomeMethod(List<? extends Insertable> list)に変更する必要があります。

+0

ありがとうございました!それは機能し、答えは明確で正確です。 –

+0

ありがとう、これは私の問題を解決するのに役立ちました。さらに、関数内でジェネリック型のオブジェクトを宣言したい場合は、 'public static void SomeMethod(List list){}'で関数を宣言することができます。その型の変数を 'T varName; 'で宣言することができます –

1

これは最初は直感的ではないようです。

私はジェネリックの全体のポイントは、静的型の安全性に基づいてリストを導入し、制約することです。

「挿入可能」をリストに入れることができれば、そこには別のクラスタイプが混在する可能性があります。

これは、危険な状態になり、ClassCastExceptionsの危険にさらされることを意味します。

+0

http://stackoverflow.com/questions/2745265/whyarent-javas-generics-implicitly-polymorphic –

関連する問題