我有以下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()”方法可以工作,但我希望能够这样做,而不必将其作为参数传递。 谢谢!
答案 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
我在这篇帖子中的代码版本略好一些:
这种方法也不是很快,所以如果考虑性能,更粗略的替代方案可能是传递T和Class&lt; T&gt;的实例。也是你需要的地方。
当然,在得到这样的类之后,你需要使用反射来实例化它。