私はこれを行うとき:
import java.util.ArrayList;
import java.util.List;
public class Wildcard {
public static void main(String[] args) {
WildcardFixed wf = new WildcardFixed();
List<Integer> li = new ArrayList<>();
li.add(0);
wf.foo(li);
System.out.println("Success");
}
}
class WildcardError{
void foo(List<?> i){
i.set(0, i.get(0));
}
}
class WildcardFixed{
void foo(List<?> i){
fooHelper(i);
}
private <T> void fooHelper(List<T> l){
l.set(0, l.get(0));
}
}
をWildcardError
クラスがメッセージ
方法を設定してコンパイルに失敗したタイプのリストでは、され(int型、キャプチャ#1-の?)引数には適用されません(int、キャプチャ#2)?
もっと単純な英語では、コンパイラはどのタイプのものがi
に含まれているかわからない、つまりget()
によって返されるタイプがわからず、set()
の引数のタイプがわからないため、 set()
操作が成功します。
WildcardFixed
、しかし、我々はl
にあるものの種類、コンパイラを安心させるという理由だけで、get
の結果はset
の引数の型と同じ型、T
、コンパイルされます。コンパイラはあまり続ける必要はありませんが、それは?
以上必要です。
あなたはもっと簡単になります。タイプパラメータT
を元のfoo()
メソッドに入れると、すべてがコンパイルされて完全に実行されます。
import java.util.ArrayList;
import java.util.List;
public class Wildcard {
public static void main(String[] args) {
WildcardFixed wf = new WildcardFixed();
List<Integer> li = new ArrayList<>();
li.add(0);
wf.foo(li);
System.out.println("Success WildcardFixed");
WildcardWithT wt = new WildcardWithT();
wt.foo(li);
System.out.println("Success WildcardWithT");
}
}
class WildcardError{
void foo(List<?> i){
i.set(0, i.get(0));
}
}
class WildcardFixed{
void foo(List<?> i){
fooHelper(i);
}
private <T> void fooHelper(List<T> l){
l.set(0, l.get(0));
}
}
class WildcardWithT {
<T> void foo(List<T> i) {
i.set(0, i.get(0));
}
}