【问题标题】:Creating a Generic instance of type in Java [duplicate]在Java中创建类型的通用实例[重复]
【发布时间】:2012-08-29 11:58:52
【问题描述】:

我有以下 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()”方法是可行的,但我希望能够这样做而不必将其作为参数传递。 谢谢!

【问题讨论】:

  • 任何扩展 MyInterface 的类都将代表 T。所以创建类并用 MyInterface 扩展它。然后创建该新类的实例。
  • 你为什么认为T 甚至有一个默认构造函数?

标签: java generics types interface instance


【解决方案1】:

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

【讨论】:

  • 感谢您的快速回答! ++
  • 哎呀,这已经在 SO 中被问了一百万次了,但这是唯一真正切中要害的答案(尽管可以直接开始 你不能 )。非常感谢!
  • @Bruno - 百万次是正确的,人们会认为 Java 设计者会接受提示并将其添加到 Java 的反射中......
【解决方案2】:

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

您可以做到这一点的唯一方法 - 将 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);
}

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      可以在特定子类中提取 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 的实例。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-09
        • 2017-04-17
        • 2012-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-21
        相关资源
        最近更新 更多