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

Unfortunately, due to type erasure, you can't do what you want.

You will have to explicitly tell your class which type it needs to instantiate, either by telling it the Class or, perhaps more elegantly, giving it a Factory to create instances.

于 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 回答