0

これが可能かどうか疑問に思っています。を保持するクラスを作成しておりNumber、その数値はFloatまたは にすることができますInteger.。ただし、実行時に決定されます。

Float または Integer のいずれかを取り、それに対して計算を実行できる、より洗練された関数を作成したいと考えています。変数の型を列挙型に格納しているため、ジェネリック/リフレクションを使用してこれを達成できることを願っています。

ここに私の列挙型があります

public enum Type {

    FLOAT,
    INTEGER;

    public final Class clazz;

    Type() {
        if (this.name().equals("FLOAT"))
            clazz = Float.class;
        else if (this.name().equals("INTEGER"))
            clazz = Integer.class;
        else
            clazz = null;
    }
}

それは私のクラスの内部です。

ここにいくつかのコードがあります:

private <T extends Number> T compareTo(Class<T> lhs, Class<T> rhs) {
    // lhs > rhs return 1
    // rhs < lhs return -1
    // else return 0
}

さて、私たちがJavaで知っているように、動的にキャストを型付けすることはできませんtype.clazz lhzType = (type.clazz) lhsが、これを行うために適切なジェネリックを使用する方法はありますか? リフレクションの問題が発生した場合、エラーとしてスローされる可能性があるため、あるべきだと思います。しかし、私は今のところ Java に関してはそれほど進んでいません。

4

1 に答える 1

3

あなたが何を達成しようとしているのか理解できませんが、あなたが投稿したコード フラグメントを実装する方法を教えてもらえます。

まず、列挙型は (境界付き) クラスをコンストラクターに渡す必要があります。

public enum Type {

    FLOAT(Float.class),
    INTEGER(Integer.class);

    private final Class<T extends Number & Comparable<T>> clazz;

    Type(Class<T extends Number & Comparable<T>> clazz) {
        this.clazz = clazz;
    }
}

あなたがそのクラスでをしようとしているのかわからないことに注意してください。

第二に、メソッドは渡されたオブジェクトの型を宣言するためにメソッドを型付けする必要があり、列挙型のクラス型を参照する必要はなく、メソッドは実際には列挙型とは何の関係もありません. これは、どこにでも配置できる静的ユーティリティ メソッドにすることができます。

public static <T extends Number & Comparable<T>> int compareTo(T lhs, T rhs) {
    return lhs.compareTo(rhs);
}

ここで重要なのは、 と の両方へのバインドですNumber。これは、Comparable<T>すべてのNumberサブクラスが を実装していますがcompareTo()Numberクラスはそれを定義していないためです。


パラメータと同じ型を返すには、次のようなリフレクションを使用できます。

// Coded for brevity rather than "best practice"
public static <T extends Number & Comparable<T>> T compareTo(Class<T> clazz, T lhs, T rhs) throws Exception {   
    String s = "some string that represents the value of the new Numner";
    T t = clazz.getConstructor(String.class).newInstance(s);
    return t;
}
于 2013-06-12T02:09:26.487 に答える