9

私は次のJavaクラスを持っています

public class MyClass <T extends MyInterface> implements RowMapper<MyInterface>

私は次の方法を実装しています:

@Override
public T mapRow(ResultSet rs, int arg1) throws SQLException {

そのクラスで「T」タイプのインスタンスを作成するにはどうすればよいですか?

T型クラスを定義して「myInstance.newInstance()」を使用しようとしましたが、定義できませんでした。クラスをパラメーターとしてメソッドに送信し、「newInstance()」メソッドを使用することは機能しますが、パラメーターとして渡さなくても実行できるようにしたいと思います。ありがとう!

4

4 に答える 4

26

Javaジェネリックは消去によって実装されます。つまり、実行時にパラメーター型の情報はありません。実行時にTクラスはわかりません(そのようなT.classはありません)。したがって、必要なことを実行するには、Classオブジェクトをメソッドパラメータとして渡す必要があります。

于 2012-08-29T12:03:07.513 に答える
10

オブジェクトをジェネリッククラス/関数に渡すときに、型に関するすべての情報が失われます。

これを行う唯一の方法-Classオブジェクトをコンストラクタ\関数に渡します:

static class Gen <T>{

    private Class<T> mClass;

    public Gen(Class<T> cls){
        mClass = cls;
    }

    public T get(){
        try{
            return mClass.newInstance();
        }catch(Exception e){
            e.printStackTrace();
            return null;
        }
    }
}

static class A{
    public String name = "A!";
}

public static void main(String[] args) {
    Gen<A> g = new Gen<A>(A.class);
    A a = g.get();
    System.out.println(a.name);
}
于 2012-08-29T12:01:30.570 に答える
1

残念ながら、型消去のため、やりたいことができません。

インスタンス化する必要のあるタイプをクラスに明示的に指示するClassか、よりエレガントに、インスタンスを作成するためのファクトリをクラスに指定する必要があります。

于 2012-08-29T12:05:16.630 に答える
1

Tが特定のサブクラスにバインドされているクラスを抽出することは可能ですが、それは非常に簡単ではありません。

http://www.artima.com/weblogs/viewpostP.jsp?thread=208860

私はここのその投稿のコードの少し良いバージョンを持っています:

http://github.com/ISA-tools/jUtils/blob/master/src/main/java/uk/ac/ebi/utils/reflection/ReflectionUtils.java

http://github.com/ISA-tools/jUtils/blob/master/src/test/java/uk/ac/ebi/utils/reflection/ReflectionUtilsTest.java

このアプローチもそれほど高速ではないため、パフォーマンスが懸念される場合は、必要な場所にTとClass<T>のインスタンスを渡すこともできます。

もちろん、そのようなクラスを取得した後は、リフレクションを使用してインスタンス化する必要があります。

于 2012-08-29T12:46:06.963 に答える