2010-11-19 12 views
4

Comparable<T>インターフェイスを使用してJavaでジェネリックスを実装しようとしています。Comparableでのジェネリックの使用

public static <T> T[] sort(T[] a) { 
    //need to compare 2 elements of a 
} 

私はComparableインタフェースにおける上記のタイプTためcompareToメソッドをオーバーライドしたい、のは、言ってみましょう。私。私は私のタイプの2つの要素を比較する必要がありますT、どうすればいいですか?私はTのタイプが何であるかわからない。

+5

あなたのタイトルはかなり一般的です。あなたの質問にもっと具体的にしてください。 –

答えて

9

public static <T extends Comparable<? super T>> T[] sort (T[] a) 
{ 
     //need to compare 2 elements of a 
} 

これはcompareTo(T other)メソッドを持っているタイプTを強制します。これは、あなたの方法で次の操作を行うことができることを意味:

if (a[i].compareTo(a[j]) > 0) } 

} 
+0

@user、正直言って、なぜあなたは余分な 'が必要なのか覚えていないのですか?スーパーT '。 'Comparable 'を使うだけで、ほとんどの場合、このメソッドが動作します。 – jjnguy

+0

」は、「T」のスーパータイプまたはおそらくは「T」自体である未知のタイプを表します。同様に ''はTの未知のサブタイプ、あるいはおそらくはT自体である。 – eaj

+0

'? 'super T'はあなたに以下を持たせることができます:' class Person implements Comparable ;学生はPersonを拡張し、 'sort(new Student [] {});' – meriton

0

は、あなたがあなたの方法に型制約を設定する必要が<T extends Comparable<T>>を使用してみてください、その後compareTo

0

古い質問けど...

jjnguyが答えたとおり、あなたが使用する必要があります。

public static <T extends Comparable<? super T>> T[] sort(T[] a) { 
    ... 
} 

を次のように考えてみましょう:

クラスBは暗黙的にComparable<A>であり、ではありませんであるため、Bの配列ではComparable<T>の代わりにComparable<? super T>の代わりにソート方法を使用できませんでした。この場合には型パラメータTAにバインドされるので

A[] data = new A[3]; 
... 
data = brokenSort(A); 

:より明確にするために:

public static <T extends Comparable<T>> T[] brokenSort(T[] a) { 
    ... 
} 

は、次のような場合にはうまく動作します。 BComparable<B>を実装していないので、TBにバインドすることはできませんので

B[] data = new B[3]; 
... 
data = brokenSort(B); 

:以下は、コンパイラエラーを生成します。

関連する問題