如何获得T型泛型的类实例

如何获得T型泛型的类实例

我有个仿制类,Foo<T>..用一种方法Foo,我想获得类型T的类实例,但我不能调用T.class.

使用T.class?


慕无忌1623718
浏览 1054回答 3
3回答

拉莫斯之舞

简单地说,在Java中找不到泛型参数的运行时类型。我建议阅读关于类型擦除的一章。Java教程更多细节。这方面的一个流行解决方案是传递Class将类型参数转换为泛型类型的构造函数,例如class&nbsp;Foo<T>&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;final&nbsp;Class<T>&nbsp;typeParameterClass; &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Foo(Class<T>&nbsp;typeParameterClass)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.typeParameterClass&nbsp;=&nbsp;typeParameterClass; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;bar()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;you&nbsp;can&nbsp;access&nbsp;the&nbsp;typeParameterClass&nbsp;here&nbsp;and&nbsp;do&nbsp;whatever&nbsp;you&nbsp;like &nbsp;&nbsp;&nbsp;&nbsp;}}

RISEBY

然而,有一个小漏洞:如果您定义Foo类作为抽象类。这意味着必须将类实例化为:Foo<MyType>&nbsp;myFoo&nbsp;=&nbsp;new&nbsp;Foo<MyType>(){};(请注意末尾的双大括号。)现在您可以检索T在运行时:Type&nbsp;mySuperclass&nbsp;=&nbsp;myFoo.getClass().getGenericSuperclass();Type&nbsp;tType&nbsp;=&nbsp;((ParameterizedType)mySuperclass).getActualTypeArguments()[0];不过,请注意mySuperclass必须是类定义的超类,实际上定义了T.它也不是很优雅,但是你必须决定你是否更喜欢。new Foo<MyType>(){}或new Foo<MyType>(MyType.class);在你的密码里。例如:import&nbsp;java.lang.reflect.ParameterizedType;import&nbsp;java.lang.reflect.Type;import&nbsp;java.util.ArrayDeque;import&nbsp;java.util.Deque; import&nbsp;java.util.NoSuchElementException;/** &nbsp;*&nbsp;Captures&nbsp;and&nbsp;silently&nbsp;ignores&nbsp;stack&nbsp;exceptions&nbsp;upon&nbsp;popping. &nbsp;*/public&nbsp;abstract&nbsp;class&nbsp;SilentStack<E>&nbsp;extends&nbsp;ArrayDeque<E>&nbsp;{ &nbsp;&nbsp;public&nbsp;E&nbsp;pop()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;super.pop(); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;catch(&nbsp;NoSuchElementException&nbsp;nsee&nbsp;)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;create(); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;} &nbsp;&nbsp;public&nbsp;E&nbsp;create()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type&nbsp;sooper&nbsp;=&nbsp;getClass().getGenericSuperclass(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type&nbsp;t&nbsp;=&nbsp;((ParameterizedType)sooper).getActualTypeArguments()[&nbsp;0&nbsp;]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(E)(Class.forName(&nbsp;t.toString()&nbsp;).newInstance()); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;catch(&nbsp;Exception&nbsp;e&nbsp;)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;null; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;}}然后:public&nbsp;class&nbsp;Main&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Note&nbsp;the&nbsp;braces... &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;Deque<String>&nbsp;stack&nbsp;=&nbsp;new&nbsp;SilentStack<String>(){}; &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(&nbsp;String&nbsp;args[]&nbsp;)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Returns&nbsp;a&nbsp;new&nbsp;instance&nbsp;of&nbsp;String. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;s&nbsp;=&nbsp;stack.pop(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.printf(&nbsp;"s&nbsp;=&nbsp;'%s'\n",&nbsp;s&nbsp;); &nbsp;&nbsp;&nbsp;&nbsp;}}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java