在Java中创建类型的通用实例[重复]

Posted

技术标签:

【中文标题】在Java中创建类型的通用实例[重复]【英文标题】:Creating a Generic instance of type in Java [duplicate] 【发布时间】: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 甚至有一个默认构造函数? 【参考方案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 的实例。

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

【讨论】:

以上是关于在Java中创建类型的通用实例[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在类本身中创建一个类的实例[重复]

访问Class中的常量而不在ObjectiveC中创建类的实例[重复]

如何在java中创建二维数组[重复]

使用SQLAlchemy,如何在类中创建一个字段,该类是所述类的其他实例的列表? [重复]

如何在Java中创建具有特定结构的XML文件[重复]

如何在 Javascript 中创建静态字段 [重复]