2

Java で汎用クラスを作成しようとしています。そのクラスのいくつかのメソッドはそれを必要としT extends Comparable<T>ます。Tこれらの方法のいずれかが使用されている場合にのみ比較可能である必要があるようにするにはどうすればよいですか? それとも、クラスを編成する別の方法がありますか?

これが私が実装しようとしているクラスです。比較可能なタイプと比較できないタイプの両方で使用する予定の配列です。

// I know Java has its own containers, but this
// is homework and I'm not allowed to use them
class Array<T>
{
    // Some methods that pose no
    // special restrictions on T

    // These require that T be comparable
    public Array<T> union(...) {...}
    public Array<T> intersect(...) {...}
}
4

3 に答える 3

3

Tメソッドの型を隠すことができます。TofはここTestと同じではありません。TCompareMethod

public static class Test<T> {
    <T extends Comparable<T>> void compareMethod(T t, Class<T> classt) {
    }
    void normalMethod(T t) {
    }
}

今の例

    Test<String> test = new Test<String>();//Comparable class
    test.compareMethod("",String.class);//works fine
    Test<Random> tes1t = new Test<Random>();//Non Comparable class
    tes1t.compareMethod(new Random(),Random.class);//Compilation error here 
    tes1t.normalMethod(new Random());//Works fine
    new Test<Random>().compareMethod("",String.class);// Not a good but can be valid
new Test<String>().compareMethod(new Random(),Random.class);//Compilation error here

アップデート:

toArray()この解決策について呪われた後、私はJava APIでいくつかの検索を行いました.

ArrayList<String> string = new ArrayList<String>();
string.toArray(new Integer[5]);<--Illegal however <T> is hide by toArray method
于 2012-10-27T12:34:06.660 に答える
2

編集: 結局、これは可能のようです (AmitD の投稿を参照)。とにかく、他の可能な解決策は

  1. サブクラスに匹敵する必要があるメソッドをリファクタリングする
  2. 関連するメソッドでキャストを使用するだけです。つまり、その部分は実行時にのみチェックされます。
于 2012-10-27T12:32:45.210 に答える
1

コンパレートを使用するなど、通常の方法では不可能です。

正確な要件は何かを共有した方がよいでしょう。

ArrayList/Arrays での並べ替えが目標である場合、比較できないクラスを比較することは役に立ちません。ソートは、同じタイプまたはサブタイプのオブジェクトでのみ実行できます。

ただし、オブジェクトが等しいかどうかを確認するために比較を使用する場合は、equals(Object O) メソッドをオーバーライドすることをお勧めします。

于 2012-10-27T12:41:25.887 に答える