2012-02-18 14 views
0

私は次のコードをお持ちの場合:汎用インタフェース - Javaの

public interface BinaryTree<T extends Comparable<? super T>>{} 

それはそれが正しいComparableを実装するオブジェクトを受け入れるインタフェースだということを意味しますか? <?Super T>とはどういう意味ですか?

次に、実装を書く場合BinaryTree クラスの減速度はどのように見えるのですか?

答えて

3

<? super T>のスーパータイプである未知のタイプを表し、(@GETahは、ドキュメントを引用しているように。)を「Tの任意のスーパークラス(またはスーパーインタフェース)」を意味

だから、あなたのクラスpublic class MyBinaryTree<T extends Comparable<? super T>> implements BinaryTree<T> {...}のようになります。MyBinaryTreeの汎用パラメータをインターフェイスで必要なものと互換性があるように指定する必要があります。

+0

Tもありますか? –

+0

達成しようとしていることの例を挙げることはできますか?もしあなたがすでに縛られているのなら、なぜあなたは別の 'T'を必要としますか?必要な他の追加タイプ(例えば、 'E'または' MY_TYPE'など)を指定することもできます。ただし、大文字を使用するのがコンベンションです。 –

2

Javaの定義では、「?」が「不明なタイプ」です。 ジェネリック型Gの場合、型インスタンスGは他のすべての型インスタンスの スーパータイプです。

未知の型の変数は割り当てできません。読み込み時には がオブジェクトと見なされます。

public void foo(G<?> g) { 
    Object o = g.e; // Allowed 
    g.e = new Object(); // Not allowed 
} 

たとえば、コレクション全体の印刷:コレクションは、すべてのコレクションのスーパータイプであるため、この作品

void print(Collection<?> c) { 
    for(Object e: c) { 
    System.out.println(e); 
    } 
} 

を。

未知のタイプの先祖(G<? extends X>)は、未知のタイプのインスタンスを読み取ることができます。
G<? super Y>とマークされた未知の型の子孫は、未知の型のインスタンスに書き込むことを可能にします。

0

BinaryTree型パラメータを受け取り、型パラメータは、それ自体のインスタンスとComparable又はそのスーパークラスの一つであるクラスでなければなりません。

Frobgitというクラスがimplements Comparable<Frobgit>と宣言されていれば、それはBinaryTreeの有効な型パラメータになります。 implements Comparable<Object>と宣言されていれば、それもOKです。

BinaryTreeは、そこに格納されているオブジェクトを比較する必要があります。これにより、そのようにすることができます。 <? super T>については