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

时间:2012-08-29 11:58:52

标签: java generics types interface instance

我有以下Java类

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

我正在实施以下方法:

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

如何在该课程上创建“T”类型的实例?

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

4 个答案:

答案 0 :(得分:26)

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

答案 1 :(得分:10)

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

唯一可以做到这一点的方法 - 将Class对象传递给构造函数\ function:

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);
}

答案 2 :(得分:1)

不幸的是,由于类型擦除,你无法做你想做的事。

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

答案 3 :(得分: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&lt; T&gt;的实例。也是你需要的地方。

当然,在得到这样的类之后,你需要使用反射来实例化它。