在Java中创建类型的通用实例

Creating a Generic instance of type in Java

本问题已经有最佳答案,请猛点这里访问。

我有下面的Java类

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

我正在实现以下方法:

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

如何在该类上创建"t"类型的实例?

我试图定义T类型类并使用"myInstance.newInstance()",但无法定义它。将类作为参数发送到方法并使用"newInstance()"方法可以,但我希望能够这样做而不必将其作为参数传递。谢谢!


Java泛型是通过擦除实现的,这意味着在运行时将不存在参数类型信息。你不会在运行时知道T类(没有T.Class)。因此,您需要将Class对象作为方法参数传递,以便执行您想要的操作。


当将对象传递到泛型类/函数时,您将丢失有关类型的所有信息。

唯一的方法是将Class对象传递给constructor 函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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);
}


可以提取T绑定到特定子类中的类,尽管这并不容易:

http://www.artima.com/weblogs/viewpost.jsp?螺纹=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的实例。

当然,在获得此类之后,您需要使用反射来实例化它。


不幸的是,由于类型擦除,您无法执行所需的操作。

你必须明确地告诉你的类它需要实例化哪种类型,要么告诉它Class,或者更优雅地说,给它一个工厂来创建实例。