Creating a Generic instance of type in Java
我有下面的Java类
1 | public class MyClass <T extends MyInterface> implements RowMapper<MyInterface> |
我正在实现以下方法:
1 2 |
号
如何在该类上创建"t"类型的实例?
我试图定义T类型类并使用"myInstance.newInstance()",但无法定义它。将类作为参数发送到方法并使用"newInstance()"方法可以,但我希望能够这样做而不必将其作为参数传递。谢谢!
Java泛型是通过擦除实现的,这意味着在运行时将不存在参数类型信息。你不会在运行时知道T类(没有T.Class)。因此,您需要将
当将对象传递到泛型类/函数时,您将丢失有关类型的所有信息。
唯一的方法是将
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | 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); } |
可以提取T绑定到特定子类中的类,尽管这并不容易:
http://www.artima.com/weblogs/viewpost.jsp?螺纹=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
当然,在获得此类之后,您需要使用反射来实例化它。
不幸的是,由于类型擦除,您无法执行所需的操作。
你必须明确地告诉你的类它需要实例化哪种类型,要么告诉它