2011-04-01 4 views
1

私はクラスがあり、それは異なるタイプを含み、Iterable<Object>インターフェイスを実装します。しかし、私が要素を比較できることは、私にとって非常に重要です。私は、Iterable<Object & Comparable<?>>のようなものを書くことができないことを認識しています。どうすればいいですか?オブジェクトを匹敵するようにする方法

私はクラスに含まれるすべての単一の要素ことを、保証している:

  • nullすることはできません。
  • 同じ型要素に匹敵します。
  • 不変です。まあ、少なくとも私がチェックしている部分。

それは私がしていることを行うことができますので、私はちょうど、要素を比較したい、それはありません。

private static int hackCMP(Object val, Object val2) 
     throws SecurityException, NoSuchMethodException, 
     IllegalArgumentException, IllegalAccessException, 
     InvocationTargetException { 
    Method m = val.getClass().getMethod("compareTo", val.getClass()); 
    return (Integer) m.invoke(val, val2); 
} 

私も要素がする必要が確実に別のクラスの間接コンストラクタへの入力としての要素を渡したいです匹敵する。この方法は次のとおりです。

public static <T extends Comparable<?>> Os of(final Iterator<T> values) { 
+1

'Iterable >'実際には可能です。 ;) –

+3

あなたの署名を 'Iterable >'に変更してみませんか?すべてのオブジェクトが行うので、オブジェクトが 'Object'を拡張しなければならないことを明示的に述べることによって何も得られません。 –

+0

@Dave Costa:Ty、これは私の問題を解決しました。 – Margus

答えて

2

デイブ・コスタは、上記のポイントは、あなたが本当にただIterator<Comparable<?>>を使用することではなく、そこにObjectを持っている必要があります。あなたのタイプは、必要に応じて特定のものにする必要があります。 Comparable<?>が必要なメソッドがある場合は、それを使用します。オブジェクトを受け入れるメソッドは、とにかくComparable を含む何でも取ることができます。

1

あなたは

public static <T extends Object & Comparable<?>> Os of(final Iterator<T> values) { 

を書き込むことができるあなたの質問か?

編集:オブジェクトが同等であると仮定したい場合は、これを行うことができます。

public static int compare(Object o1, Object o2) { 
    return ((Comparable) o1).compareTo((Compareable) o2); 
} 
+1

いいえ、それは私の質問ではありません。 '>は' > 'と同じです(クラスオブジェクトはクラス階層のルートです。すべてのクラスはスーパークラスとしてObjectを持ちます)。 – Margus

+0

ジェネリック医薬品には相違があると私は信じていますが、それは私を逃してしまいます。いずれにせよ、あなたの質問は何ですか? –

+0

まあ、私はすべての要素が匹敵するが、オブジェクトとして格納されていることを知っていれば。それから、方法に渡す方法、それはあなたのことが匹敵すると仮定します。 – Margus

0

使用するための最善のことは、あなたが実際にタイプは、それ自体と同程度であることを保証するものではないT extends Comparable<?>を、持っている場合ので、あなたは、そこでの二Tを持っている必要があり<T extends Comparable<? super T>>

です。あなたはそれが愚かだと思うかもしれませんが、私がクラスFoo implements Comparable<String>を作ることは完全に可能であり、したがってFooオブジェクトは自分自身と比較することができません。 2番目のTがなければ、オブジェクトがそれ自身と比較することを保証することができず、生の型やそれを渡すために安全でないものをキャストまたは使用する必要があります。

? superはもう少し微妙です。これは、Comparableクラスのサブクラスを考慮する場合に必要です。たとえば、A implements Comparable<A>B extends Aの場合は、自動的にB implements Comparable<A>Bimplement Comparable<B>になりません。これは1回のインターフェイスしか実装できないためです)。したがって、Bがデザインで機能するようにするには、Tのスーパークラスにするために、Comparableのパラメータはでなく、Tでなければなりません。