コード
Set<? extends MyClass> mySet = new HashSet<>();
mySet.add(new MyClass());
エラーメッセージを生成します。その理由は、コンパイラがmySetの型を認識していないためです。わかっているのは、mySetの型がSet<SomeType>であり、SomeTypeが MyType のサブタイプであることだけです。コンパイラはSet<? の型がわからないため です。extends MyClass>は、そのタイプのセットに挿入できる唯一のものを参照し、null です。
これは非常に紛らわしく、唯一可能な要素がnullであるセットの使用は最小限であるため、<? 上記の例のように、オブジェクトを宣言するときにSomeClass>を拡張します。この形式は、後で具象化される抽象化 (パラメーター、ジェネリック クラスまたはメソッドなど) を宣言する場合にのみ使用してください。
これは質問ではないことはわかっていますが、アイデアに対する反応はどうなのだろうか.