41

ジェネリックについて Java の質問があります。一般的なリストを宣言しました:

List<? extends MyType> listOfMyType;

次に、いくつかの方法で、インスタンス化してそのリストに項目を追加しようとします。

listOfMyType = new ArrayList<MyType>();
listOfMyType.add(myTypeInstance); 

myTypeInstanceはタイプのオブジェクトですMyType。コンパイルされません。それは言います:

List<capture#3-of ? 型の add(capture#3-of ? extends MyType) メソッド extends MyType> は引数 (MyType) には適用されません

何か案が?

4

5 に答える 5

34

extends で「プット」を行うことはできません。Generics - Get and Put rule を見てください。

于 2009-05-27T21:16:30.740 に答える
28

検討:

class MySubType extends MyType {
}

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

subMyTypeは非常に間違っているが含まれています。

于 2009-05-27T21:29:49.077 に答える
6

ケースでワイルドカードキャプチャ構文を使用する必要はなく、単に宣言するだけです。

List<MyType> listOfMytype;

十分なはずです。正確な理由を知りたい場合は、Java Genericsチュートリアルに、JavaGenericsの難解な狂気について知りたいと思う以上のものがあります。20ページでは、特定のケースについて説明しています。

ワイルドカードキャプチャを使用した追加が機能しない理由については、コンパイラがすべての場合にリストがMyTypeのどのサブクラスになるかを正確に判断できないため、コンパイラはエラーを発行します。

于 2009-05-27T21:29:47.233 に答える
3

ここにも同様のスレッドがあります: 要素をワイルドカード ジェネリック コレクションに追加するにはどうすればよいですか?

ジェネリックがどのように機能するかを理解するには、次の例を確認してください。

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

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

問題は、これはローカル/メンバー変数用に設計されたものではなく、関数シグネチャ用に設計されたものです。

于 2011-03-23T13:16:05.267 に答える
3

これが本当に役立つかどうかはわかりませんが、これはSpring Frameworkのジェネリックメソッドを呼び出し、ジェネリックリストも返したいときに使用しなければならなかったものです:

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

パラメータ化には ? を使用する必要があるようです。リストにサインインして結果を受け取り、リストを期待される戻り値の型にキャストします。

私はまだジェネリックに目がくらんでいます...

于 2012-03-16T01:19:58.067 に答える