次の構文が正しくないことはわかっています。
void dolist2(List<? extends Number> list) {
list.add(new Integer(3));
}
しかし、コンパイラがそれが合法ではないことをどのように認識しているかはわかりません。List.java のソース コードを見ると、次のように表示されます。
boolean add(E e);
@IllegalWhenInvokedOnUpperBoundReference のような注釈でさえ、この宣言について特別なことは何も見当たりません。コンパイラは、この制限を強制することをどのように認識していますか? 自分のクラスに同様の制限を設定するにはどうすればよいですか?