2009-05-27 14 views
36

ジェネリックに関するJavaに関する質問があります。私は、一般的なリストを宣言:リスト<? extends MyType>

List<? extends MyType> listOfMyType; 

は、その後、いくつかの方法で、私はインスタンス化し、そのリストに項目を追加してみてください:

myTypeInstanceはタイプ MyTypeの単なる対象である
listOfMyType = new ArrayList<MyType>(); 
listOfMyType.add(myTypeInstance); 

。それはコンパイルされません。それは言う:

メソッドAdd(キャプチャ#3-の がMyTypeを拡張?)タイプのリストに<キャプチャ#3-の を? extends MyType>は適用されません。 引数(MyType)

ご存じですか?

答えて

29

拡張で「put」を実行することはできません。 Generics - Get and Put ruleを見てください。

+9

ジョシュ・ブロッホが言うように: "PECSを忘れないでください:プロデューサーは、消費者のスーパーを拡張します。" listOfMyTypeはコンシューマ(あなたが追加しているコンシューマ)なので、 'super'は有効で' extends'はそうではありません。 –

+0

リンクが壊れています。 –

+0

pedantryのポイント:あなたは 'null'と' extend'を 'put 'することができます。また、以前に取得した参照をタイプして「置く」こともできます。 –

4

あなたは、単に十分なはず

List<MyType> listOfMytype; 

を宣言し、あなたのケースでワイルドカードキャプチャ構文を使用する必要はありません。理由を正確に知りたい場合は、 Java Generics Tutorialには、Java Genericsの難解な狂気についてもっと知りたいと思う以上のものがあります。あなたの特定のケースに対処してください。

なぜ、ワイルドカードキャプチャでの追加が機能しないのかは、コンパイラがどのような場合でもMyTypeのどのサブクラスであるかを正確に判断できないためです。

22

は考えてみましょう:

class MySubType extends MyType { 
} 

List<MySubType> subtypeList = new ArrayList<MySubType>(); 
List<? extends MyType> list = subtypeList; 
list.add(new MyType()); 
MySubType sub = subtypeList.get(0); 

subは現在、非常に間違っているMyTypeが含まれています。

+0

"list.get(0);"実際には "subtypeList.get(0);" ? – Zds

+0

@Zdsはい、修正済みです。ありがとう。 –

2

ここで同様のスレッドがあります: How can elements be added to a wildcard generic collection?

ジェネリック作品が、この例をチェックアウトする方法のアイデアを取得するには:

List<SubFoo> sfoo = new ArrayList<SubFoo>(); 
    List<Foo> foo; 
    List<? extends Foo> tmp; 

    tmp = sfoo; 
    foo = (List<Foo>) tmp; 

事はそれがローカル/メンバーのために設計されていない、あります変数を使用していますが、関数シグニチャの場合は、逆の結果になります。

私はこれが本当にあなたを助けるでしょうが、これは春のフレームワークの一般的なメソッドを呼び出しても、一般的なリストを返したいしながら、私が使用していた何かであれば知らない
2

public <T> List<T> findAll(String tableName,Class<?> table) { 
    String sql = "SELECT * FROM "+ tableName ; 
    List<?> entities = getSimpleJdbcTemplate().query(sql, 
      ParameterizedBeanPropertyRowMapper.newInstance(table)); 
      return (List<T>) entities; 
} 

は、パラメータ化のニーズですあなたは?を使用する?リストにサインインして結果を受け取り、リストを期待されるリターン・タイプにキャストします。

まだジェネリック医薬品で目がくらむIamは...

関連する問題