LinkedList 操作のほとんどがジェネリック パラメーター タイプ E を受け取り、いくつかはパラメーターとして「オブジェクト」を受け取ることに気付きました。たとえば、
add(E e)
remove(Object o)
そうする具体的な理由はありますか?「削除」をジェネリック型 E にしないのはなぜですか (型の消去後は問題にならないことはわかっていますが、疑問に思っています)。
LinkedList 操作のほとんどがジェネリック パラメーター タイプ E を受け取り、いくつかはパラメーターとして「オブジェクト」を受け取ることに気付きました。たとえば、
add(E e)
remove(Object o)
そうする具体的な理由はありますか?「削除」をジェネリック型 E にしないのはなぜですか (型の消去後は問題にならないことはわかっていますが、疑問に思っています)。
これは、削除equals()
操作がメソッドを使用して等価性をチェックし、equals()
メソッドがジェネリックではなくオブジェクトをパラメーターとして受け取るためです。
呼び出し元は任意のタイプのオブジェクトを呼び出しremove
たりcontains
使用したりでき、コードは問題なく実行されるためです。コレクションの型パラメーターが使用するコンパイル時の契約は、コレクション内のすべてが指定された型になることを保証します* 。異なるタイプのオブジェクトが含まれているかどうかを尋ねるかどうかは気にしません。
*ニトピッカーのコーナー、Javaジェネリックが実際には保証されないことは知っています。シンタックスシュガーのほうが多いと思います。
add メソッドと remove メソッドはどちらも Collection インターフェイスから継承されます。remove メソッドは、おそらく問題にならないため、一般的な引数で後付けされませんでした。削除はコレクションの型の安全性に影響を与えません。地球上で最も人気のある API の 1 つを変更する場合は、変更が少ない方がよいでしょう。contains メソッドも同じ運命をたどったことがわかります。