次のコードは、Eclipse ではコンパイルされません。「Abc 型のメソッド putHelper(List,int,E) は、引数には適用できません (List <.capture#8-of extends E>",int,E)」
private <E> void putHelper(List<E> list, int i, E value) {
list.set(i, value);
}
public <E> void put(List<? extends E> list, int toPos, E value) {
// list.set(toPos,value);
putHelper(list, toPos, value);
}
なぜそうなのかわかりませんか?以下のコードは正常に動作するためです。
public <E> void put(List<? extends E> list,int fromPos, int toPos) {
putHelper(list,fromPos,toPos);
}
private <E> void putHelper(List<E> list,int i, int j) {
list.set(j,list.get(i));
}
そして、ここでヘルパー メソッドがワイルドカード型をキャプチャできることは理解していますが、以前のコードではなぜできないのでしょうか?
編集: 3 番目のケースでは、put メソッドの型パラメーターを List<.? に変更すると、super E> リストを取る別のメソッドから put() メソッドを呼び出そうとすると、Eclipse はそれをコンパイルしません。「Abc 型の put(List<.? super E>,int,E) メソッドは引数に適用できません (List <.capture#6-of extends E>",int,E)」
public static <E> void insertAndProcess(List<? extends E> list) {
// Iterate through the list for some range of values i to j
E value = list.get(i);
//Process the element and put it back at some index
put(list, i+1, value);
//Repeat the same for few more elements
}
private static <E> void putHelper(List<E> list, int i, E value) {
list.set(i, value);
}
public static <E> void put(List<? super E> list, int toPos, E value) {
putHelper(list, toPos, value);
}
ここで、insertAndProcess() が put() メソッドを呼び出してその実装で使用するにはどうすればよいでしょうか。ユーザーはこれらのメソッドを ArrayList<.Integer> などで呼び出すことができますか?