2

このジェネリック クラスを作成/注入するときに配置されるジェネリック型引数からクラス型を取得するジェネリック クラスを作成するにはどうすればよいですか? 私の目標は eg を指定することであり、ジェネリック クラスはすべてのメソッド呼び出しでMyGeneric<User>そのクラスを使用できるようにする必要があります。ジェネリックのコンストラクターでUser明示的に追加する必要はありません。User.class

何かのようなもの:

class MyGeneric<T> {
    public MyGeneric() {
        someService.create(Class<T>, someString);
    }
}

class Usage {
    @Inject
    MyGeneric<User> myuser;
}

これはどのように適切に行われますか?

4

3 に答える 3

2

実行時のタイプの eraseのため、それを行う方法はありません。

通常の方法は、(ほのめかしたように) のインスタンス (型トークンClass<T>と呼ばれる) をコンストラクターに渡すことです。コードパターンを考えると、このアプローチに行き詰まっています。

于 2012-10-29T11:23:57.247 に答える
0

できることは、インスタンス化コードをスーパークラスに記述し、それを特定のジェネリック型ごとに拡張することです (サブクラスではコードはほとんどまたはまったく必要ありませんが、型の消去を回避する唯一の方法であるため、サブクラスは必須です)。

abstract class MyGeneric<T> {

    private T instance;

    public MyGeneric(String str) {
        // grab the actual class represented by 'T'
        // this only works for subclasses of MyGeneric<T>, not for MyGeneric itself !
        Class<T> genericType = (Class<T>) ((ParameterizedType)getClass().getGenericSuperclass())
                .getActualTypeArguments()[0];
        try {
            // instantiate that class with the provided parameter
            instance = genericType.getConstructor(String.class).newInstance(str);
        } catch (Exception e) {
            throw new IllegalArgumentException(e);
        }
    }
}

class MyUser extends MyGeneric<User> {
    public MyUser() {
        // provide the string to use for instantiating users...
        super("userStr");
    }
}

class User { /*...*/ }

abstract編集:サブクラスの使用を強制するために汎用クラスを作成しました。

次のような匿名クラスでも使用できます。

new MyGeneric<User>("..string...") {}

これが最初の目標に最も近いと思います...

于 2012-10-29T11:38:54.097 に答える
0

少しトリッキーですが、たとえば Guice の TypeLiteral を使用すると、次のようなことができます。

public class ReiHashMap<K,V> extends HashMap<K,V> {

   private final TypeLiteral<K> keyTL;

   public ReiHashMap(TypeLit<K> keyTL ) {
       this.keyTL = keyTL;
   }

   @Override
   public V get(Object o) {
       if ( !keyTL.getRawType().isAssignableFrom( o.getClass() )) {
           throw new IllegalArgumentException( "object " + o + " (class "+ o.getClass() +")ist not of type " + keyTL);
       }
       return super.get(o);
   }
   ...

これは実行時に get の引数の型をチェックできる HashMaps の拡張です。

于 2012-10-29T11:29:36.193 に答える