私はJava Generics documentationを見て、コードのこの部分を発見された、Javaのジェネリックキャプチャリスト<?>
public class WildcardError {
void foo(List<?> l) {
//This give a compile time error
l.set(0,l.get(0));
}
}
私たちはList<?>
から要素を取得し、別のList<?>
に設定しようとしていることを理解することができます。コンパイラはエラーを出します。私の質問は、2つのリストが異なる場合、つまりl.set(0, m.get(0))
ここではl
とm
のリストが異なる場合に意味があります。しかし、上記の例では、l
とl
は同じリストです。なぜコンパイラーはそれを見るほどスマートではないのですか?それを実装するのは難しいですか?
編集: 私はヘルパーメソッドによって、または?
の代わりにT
を使用して、それを修正できることを承知しています。なぜコンパイラが私のためにそれをしないのだろうかと思っています。
私は長い間、正式な理由について不思議でした。私は個人的には、これはJLSの機能が欠けていると感じています。両方のワイルドカードが正式に同じであるためです。直感では...しかしおそらく、より複雑なコードでは、 "同一の"ワイルドカードを認識するのが難しくなる –
ええ。おそらく、スペックをかなり複雑にする興味深いコーナーケースがあります。良い質問。これは、この質問の一般化のようなものです。フォローアップとして投稿する必要があります。 – aioobe
これは問題です:http://stackoverflow.com/questions/11500385/how-does-the-jls-justify-that-wildcards-cannot-be-formally-used-within-methods –