1

ジェネリッククラスの定義の次の部分に遭遇しました。

public class binarysearchnode<T extends Comparable<T>> implements Comparable<binarysearchnode<T>>{
.............
}

比較可能なインターフェースを実装しているときに、クラスが比較可能なタイプパラメーターとしてそれ自体を指定する理由を説明するのを手伝ってください。次の場合とどのように異なりますか。

public class binarysearchnode<T extends Comparable<T>> implements Comparable<? super (or extends)T>{
.............
}
4

3 に答える 3

6

binarysearchnodeこれにより、 sを相互に比較することができます。を実装した場合、その代わりに、ノードをノードのComparable<T>と比較できることを意味しますが、これは奇妙なことです。

クラスの中には、おそらく次のようなものがあります。

T value;

public int compareTo(binarysearchnode<T> other) {
   return value.compareTo(other.value);
}

このように実装できるようにするcompareTo()には、値クラス(T)がそのクラスの他のオブジェクトと比較可能である必要があります。したがって、<T extends Comparable<T>>クラス定義での宣言です。

于 2012-12-29T17:09:14.933 に答える
2

これは、クラスの作成者が次のように記述できるようにすることを望んでいるためです。

b1.compareTo(b2)

b1はインスタンスですb2binarysearchnode開発者は、拡張するように制約も追加しますT。おそらく、forの実装がインスタンス自体に依存できるようにするためです。TComparable<T>ComparablebinarysearchnodeTComparable

より一般的には、クラスC1が を実装することは可能ですがComparable<C2>、最終的にはそうしても意味がありません。これは、 のインスタンスが のC2インスタンスに匹敵する可能性があることを意味しませんC1。また、型の消去により、たとえば、クラスが と の両方C1実装することはできません。 Comparable<C1>Comparable<C2>

また、直接binarysearchnode<T>実装Comparable<T>すると、少なくとも 2 つの問題が発生します。

  • binarysearchnode<T>互いに比較することはできません。
  • binarysearchnote<T>instancebTinstanceが与えられた場合t、書くことはできますが、書くことはできませb.compareTo(t)t.compareTo(b)(T実装しないし、実装できないため)、それは契約Comparable<binarysearchnode<T>>を破ります。Comparable
于 2012-12-29T17:10:45.260 に答える
2

AスーパークラスとサブクラスがあるとしましょうBComparable<A>スーパークラスの implementsを想像してみてください。BこれもComparable<A>継承によって実装されます。

そのように宣言されたあなたのbinarysearchnodeクラス:

public class binarysearchnode<T extends Comparable<T>>

Bの型パラメータとして取ることはできませんT(Bは実装しませんComparable<B>) しかし、そのように定義されている場合:

public class binarysearchnode<T extends Comparable<? super T>>

を満たす実装なのでB、 の型パラメータとして取ることができます。TBComparable<A>Comparable<? super T>

于 2012-12-29T19:33:28.350 に答える