4

Enum をパラメータとして Java のメソッドに渡した場合、戻り値の型を自動的に推測することは可能ですか?

getValue をジェネリックにし、Enum の情報を使用することで、これらの呼び出しをサポートできるようにしたいと考えています。

String myval = obj.getValue(MyEnum.Field1)
int myval2 = obj.getValue(MyEnum.Field2)

現在のソリューション

私の現在のソリューションは次のようになります。

String val = typeRow.getColumnValueGen(TYPEGODKENDCRM.COLUMN_TYPEGODKENDNR, String.class)

これは、テーブルの ORM 表現で列にアクセスするためのものです。このフィールドが文字列であることはわかっていましたが、呼び出しのたびにそれを伝える必要は避けたいと思います。

4

3 に答える 3

6

Enum をパラメータとして Java のメソッドに渡した場合、戻り値の型を自動的に推測することは可能ですか?

いいえ。Java では戻り値の型によってメソッドをオーバーロードすることはできません。

public <T> T getValue(MyEnum enumValue)

コンパイラがT引数に基づいて推論する方法はありません。型推論が機能する場合もありますが、このようにはなりません。コンパイラが引数のいくつかの側面を調べて、その値に基づいて型を推測したり、検証したりする方法はありません。

他のことはさておき、引数がコンパイル時の定数でない場合、それが何をすることを期待しますか?

MyEnum x = getEnumValue();
// Is this valid or not?
String myVal = obj.getValue(x);

基本的に、戻り値をキャストする必要があります... の場合はではなくintにキャストする必要があり、残りは自動ボックス化解除に任せます。Integerint

個人的には、複数のメソッドを作成するだけです:

String x = obj.getString(...);
int y = obj.getInt(...);

あいまいさの余地がなく、ジェネリックなどの賢さは必要ありません。

于 2013-01-24T13:39:46.907 に答える
2

一言で言えば、いいえ。 getValue を返すオブジェクトとして宣言し、返されたオブジェクトを実際の型にキャストする必要があります。かわいくない。

于 2013-01-24T13:39:37.090 に答える
2

これを試して:

Object getValue(MyEnum returnType) {
    if (returnType == MyEnum.STRING) {
        String myString = ...
        return myString;
    }
    else if (returnType == MyEnum.INT) {
        int myInt = ...
        return Integer(myInt);
    }
}

それから:

String myval = (String) obj.getValue(MyEnum.Field1);
int myval2 = ( (Integer) obj.getValue(MyEnum.Field2) ).intValue();

これが機能するには参照型を使用する必要があるため、Integerの代わりに sが必要であることに注意してくださいint

ちなみに、私はこれをお勧めしません。あなたがやろうとしていることについてもっと情報を提供したい場合は、より良い方法を提案できるかもしれません.

于 2013-01-24T13:41:01.837 に答える