Javaでワイルドカードのトピックを調べていたところ、以下のコードで行き詰まりました
static <T> void type(List<? super T> list){
//...
}
static <T> void type2(List<? extends T> list){
//...
}
このコードでこれらのメソッドを呼び出すと、エラーが発生しますが、それは理解できます
List<?> unbounded=new ArrayList<Long>();
//! type(unbounded); //:Error here
//! type2(unbounded); //:Same Error here
しかし、次のように、引数を 1 つ追加してこれらのメソッドのシグネチャを変更すると、
static <T> void type(List<? super T> list, T arg){
//...
}
static <T> void type2(List<? extends T> list, T arg){
//...
}
そしてそれらを
List<?> unbounded=new ArrayList<Long>();
Long lng=90L;
//! type(unbounded,lng); //:Error here
type2(unbounded,lng); //No error in this one now
余分な引数を1つ追加するだけで、なぜこの動作になるのですか?? 1つの追加引数を追加するだけで、境界付きリストが無制限リストを受け入れるのはなぜですか??