問題の最も紛らわしい側面は、ジェネリック型とクラシック型のraw型で受けなければならない根本的なメンタルスイッチです。
Generics以前は、各変数にはObjectなどの明確な型がありました。文字列を割り当てることもできますが、文字列はオブジェクトであるため、パラダイムが成り立ちます。すべての場合で、オブジェクトであるものをオブジェクト変数に割り当てます。
ジェネリックではそうではありません。宣言された変数型とは関係がないが、特定のパターンのみを満たす型List<? extends Number>
の範囲から割り当てることができる、がある場合があります。パターンはワイルドカードで記述されます。instanceof
したがって、ジェネリック変数型について推論するときに生活を楽にするためには、明確な型の単純で居心地の良い概念を放棄し、これらの「型パターン」の観点から考える必要があります。
あなたの質問の2番目の部分に関しては:List<User>
とが関連してList<Admin>
いるという事実に関係なく、とは完全に無関係なタイプです。これがジェネリックスの仕組みであり、それには十分な理由があります。Javaでは、に追加することはできません。また、次のような事態が発生する可能性があります。User
Admin
OrdinaryUser
List<Admin>
List<User> users = new ArrayList<Admin>();
users.add(new OrdinaryUser()); // shouldn't be allowed!
正式な用語は、ジェネリック型は型パラメーターに関して不変であるということです。それはすでに非常によくカバーされているので、この用語のためにグーグルで回るのが最善です。