5

可能なすべてのキーと対応する値型の型を列挙型で提供する基本的なConfigurationクラスがあります。

public class Configuration {
    public static enum Key {
        FIRST_KEY("actual key 1", Long.class),
        ANOTHER_KEY("actual key 2", Integer.class)

        public final String value;
        public final Class type;

        Key(String value, Class type) {
            this.value = value;
            this.type = type;
        }
    }
}

私がやりたいのは、文字列から特定のキーの値を解析し、その値を適切なタイプとして返​​すメソッドを作成することです。基本的にこれ:

public <T> T getValue(Key<T> key, String valueStr);

Javaの列挙型は型引数を持つことができないように見えるため、この試みはすでにメソッド宣言で失敗します。これに似た何かを達成する方法についてのアイデアはありますか?

4

5 に答える 5

3

あなたは簡単にできます

public <T> T getValue(Key key, String valueStr);

ただし、コンパイル時のチェックが欠けているため、これはコンパイルに合格します

Short value = getValue(FIRST_KEY, string);  // should be Long

より良い答えは?使用しないでくださいenum。通常Key<T>のクラスを作成します。

public static class Key<T>
{
    public static final Key<Long> FIRST_KEY 
                  = new Key("actual key 1", Long.class);
    ...

    public final String value;
    public final Class<T> type;

    Key(String value, Class<T> type) {
        this.value = value;
        this.type = type;
    }
}
于 2012-09-26T15:30:34.513 に答える
2

getValue()メソッドにタイプヒントを提供します。

public <T> T getValue(Key k, Class<T> type);

キーを確認することで、メソッド内で型が正しいかどうかを確認できます。

于 2012-09-26T14:55:01.003 に答える
0

Map<Class, String> を初期化し、そのためのメソッドを追加できます。

コメントの後に編集

Map<Class, Enum>、 objectParameter が Long の場合FIRST_KEY、を与えるget(objectParameter.getClass())

当然、Long が複数のキーを持っている場合: Map<Class, Set< Enum>>作業している環境から結果を選択します。

于 2012-09-26T14:54:34.037 に答える
-1

Enum に getType メソッドを用意し、それを使用して文字列をキャストします。

列挙型の getType()。

 public Class getType()
 {      
    return type;    
 } 

getType() メソッドを使用して文字列をキャストします。

 public Object getValue(Key key , String strValue)
 {
    return key.getType().cast(strValue) ;   
 }

さまざまなオブジェクトの文字列を解析する方法を理解するには、IF ステートメントを作成する必要がある場合があります。たとえば、Integer の場合は Integer.parseInt(s) メソッドを使用します。

于 2012-09-26T15:25:39.950 に答える
-1

enum のクラスをパラメーターとして渡す必要があります。

public <T extends Enum> T getValue(key, Class<T extends Enum> enumClazz) {
    return enumClazz.cast(...);
}
于 2012-09-26T14:53:55.547 に答える