6

Preferencesクラスを作成し、GettersにはRuntime-TypeTokenを使用しません。

だからここに私のゲッターメソッドがあります:

public <T> T get(String key, Class<T> clazz) {
    // do some crazy stuff (e.g. Double <-> Float)
}

それまでは、すべてが正常に機能します。ただし、クラスパラメータはオプションにしたいと思います。

boolean b = preferences.get(key);

だから私は追加のメソッドを追加します:

public <T> T get(String key) {
    // return get(key, Class<T>);
}

今質問:それを行う方法はありますか?のインスタンスを取得する方法はありますかClass<T>

小さな回避策で可能です:

public <T> T get(String key, T... args) {
    return get(key, (Class<T>) args.getClass().getComponentType());
}

public <T> T get(String key, Class<T> clazz) {
    System.out.println("key  : " + key);
    System.out.println("clazz: " + clazz);
}

// using
Boolean b = get("mykey");
4

5 に答える 5

3

少しの回避策で可能です。

public <T> T get(String key, T... args) {
    return get(key, (Class<T>) args.getClass().getComponentType());
}

public <T> T get(String key, Class<T> clazz) {
    System.out.println("key  : " + key);
    System.out.println("clazz: " + clazz);
}

// using
Boolean b = get("mykey");

Jep 私も varargs は好きではありませんが、今のところ機能しています。

于 2012-05-25T07:03:18.460 に答える
3

できません。ただし、クラス パラメータをオプションにしたい場合は、null使用時に渡して null でないかどうかを確認するだけです。

左辺から推測したい場合、それは不可能です。

于 2012-05-23T12:47:14.557 に答える
2

この種のコードを持つことができます:

Integer i = getPref("integer");
System.out.println(i);

@SuppressWarnings("unchecked")
static <T> T getPref(String x) {
  return (T)properties.get(x);
}

ここでは、型<T>は確かに左側から推論されます。これは、明示的なダウンキャストを回避するのに役立つだけであることに注意してくださいInteger-個人的にはそれで十分であり、私はそのような獣をよく使用します. 注意すべきもう 1 つの点は、Java の型推論は非常に不十分であり、getPref別のメソッドへの引数として を呼び出して、引数の型を推論することはできないということです。

于 2012-05-23T13:08:01.510 に答える
2

いいえ。ジェネリック型情報は呼び出し元のメソッドに格納されます。コンパイルされたものT get(String key)自体は、それがジェネリックであることのみを認識していますが、呼び出しに使用された具象型を見つける方法はありません。

//code
public <T> T get(String key)
//calling code
Integer value = get("value");

//once compiled 
public Object get(String key)
//calling code
Integer value = (Integer) get("value");
于 2012-05-23T12:57:17.773 に答える
1

できませんが...

ジェネリックを介してオーバーロードするのではなく、次のパターンを検討してください。

public boolean getBoolean(String key) {
    // boolean impl here
}

public float getFloat(String key) {
    // float impl here
}

// etc

コーディングが簡単であるだけでなく、使用も簡単です。少なくとも、どのタイプが受け入れられるかを知っています。
現在のコードでは、これはコンパイルされます:

SomeUnsupportedClass x = preferences.get("foo", SomeUnsupportedClass.class);

ただし、それをサポートするコードがないため、実行時に爆発します。

ところで、それは悪いことです。実行時ではなく、コーディング時に問題を検出したいのです。

于 2012-05-23T13:08:59.860 に答える