私はジェネリック (および Java、およびスタック オーバーフロー) を初めて使用します。教科書には、ジェネリック バイナリ サーチ ツリーの実装について説明しているポイントがあります (以下の抜粋)。
Comparable インターフェースは一般的なので、次のタイプの要素を検索ツリーに格納することを考えてみましょう:
< T extends Comparable< T>>
これはまだ問題を引き起こします。Dog と Cat の両方がクラス Mammal のサブクラスであり、Mammal クラスが Comparable インターフェースを実装しているとします。ここで、哺乳動物オブジェクトを格納する二分探索木を作成すると、Dog と Cat を追加できますが、実際には互いに比較することはできません。したがって、このソリューションをこの特定の方法で使用すると、非ジェネリック バージョンの Comparable を使用した場合と同じ問題が発生します。より包括的な解決策は、知的に満足できるものではありませんが、ジェネリック型を次のように記述することです。
< T extends Comparable< ? スーパーT>>
この宣言は、要素の比較可能な性質を T の任意のスーパークラスに制限します。
したがって、型パラメーターが である必要がある理由はわかりますが、本では、 s のツリーに、互いにメソッドを呼び出そうとするさまざまなサブタイプが含まれてComparable< T>
いる場合、これが問題を引き起こす可能性があると主張しています。ツリー内のおよびオブジェクトの参照型が である場合、とにかくのメソッドを呼び出して ( である)、有効な比較 (レベルのみ) になるのではないでしょうか?Mammal
compareTo()
Cat
Dog
Mammal
Mammal
compareTo()
Comparable< Mammal>
Mammal
おそらくs がそうでない場合、クラスなどのスーパークラスにフォールバックすることComparable< ? super T>
を除いて、それは同じではないので、どのような違いが生じるのかわかりませんか?Mammal
Comparable
Comparable
Animal
型消去の厄介な結果や、私が思っているように比較が機能しない原因となるものなど、おそらく何かが欠けています。