Java ジェネリック型パラメーターを下限にバインドできない (つまり、super
キーワードを使用する) ことはできないと思います。私はAngelika Langer Generics FAQ がこの件に関して何を言わなければならなかったかを読んでいました. 彼らは、基本的に下限が役に立たない(「意味がない」)ことに帰着すると言います。
確信が持てません。型付きの結果を生成するライブラリ メソッドの呼び出し元に対して、より柔軟に対応できるようにするために、これらを使用することを想像できます。ユーザー指定のサイズの配列リストを作成し、空の文字列で埋めるメソッドを想像してください。簡単な宣言は次のようになります
public static ArrayList<String> createArrayListFullOfEmptyStrings(int i);
しかし、それはクライアントを不必要に制限しています。なぜ彼らはあなたのメソッドを次のように呼び出せないのですか:
//should compile
List<Object> l1 = createArrayListFullOfEmptyStrings(5);
List<CharSequence> l2 = createArrayListFullOfEmptyStrings(5);
List<String> l3 = createArrayListFullOfEmptyStrings(5);
//shouldn't compile
List<Integer> l4 = createArrayListFullOfEmptyStrings(5);
この時点で、次の定義を試してみたくなります。
public static <T super String> List<T> createArrayListFullOfEmptyStrings(int size) {
List<T> list = new ArrayList<T>(size);
for(int i = 0; i < size; i++) {
list.add("");
}
return list;
}
しかし、それはコンパイルされません。このコンテキストでは、super
キーワードは不正です。
上記の例は悪い例ですか (以下で言うことを無視します)? ここで下限が役に立たないのはなぜですか? それが有用であるとすれば、Java で許可されていない本当の理由は何ですか?
PS
私は、より良い組織は次のようなものかもしれないことを知っています:
public static void populateListWithEmptyStrings(List<? super String> list, int size);
List<CharSequence> list = new ArrayList<CharSequence>();
populateListWithEmptyStrings(list, 5);
この質問の目的のために、要件により、1 つのメソッド呼び出しで両方の操作を行う必要があるふりをすることができますか?
編集
@Tom Gは(当然のことながら) a を使用すると a よりもどのような利点があるかを尋ねList<CharSequence>
ますList<String>
。1 つには、返されるリストが不変であると誰も言っていないので、ここに 1 つの利点があります。
List<CharSequence> l2 = createArrayListFullOfEmptyStrings(5);
l2.add(new StringBuilder("foo").append("bar"));