在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中创建类的实例[重复]