用Java实例化泛型类

用Java实例化泛型类

我知道Java的泛型略低于.NET的泛型。

我有个普通课Foo<T>,我真的需要实例化一个T在……里面Foo使用无参数构造函数。如何绕过Java的限制?


慕标5832272
浏览 1833回答 3
3回答

饮歌长啸

一种选择是通过Bar.class(或您感兴趣的任何类型-任何指定适当类型的方法Class<T>)并将该值保留为字段:public&nbsp;class&nbsp;Test{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String&nbsp;[]&nbsp;args) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throws&nbsp;Exception&nbsp;//&nbsp;Just&nbsp;for&nbsp;simplicity! &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Generic<Bar>&nbsp;x&nbsp;=&nbsp;new&nbsp;Generic<Bar>(Bar.class); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bar&nbsp;y&nbsp;=&nbsp;x.buildOne(); &nbsp;&nbsp;&nbsp;&nbsp;}}public&nbsp;class&nbsp;Generic<T>{ &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;Class<T>&nbsp;clazz; &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Generic(Class<T>&nbsp;clazz) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.clazz&nbsp;=&nbsp;clazz; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;T&nbsp;buildOne()&nbsp;throws&nbsp;InstantiationException, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IllegalAccessException &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;clazz.newInstance(); &nbsp;&nbsp;&nbsp;&nbsp;}}public&nbsp;class&nbsp;Bar{ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Bar() &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Constructing"); &nbsp;&nbsp;&nbsp;&nbsp;}}另一个选项是有一个“工厂”接口,然后将一个工厂传递给泛型类的构造函数。这更灵活,您不需要担心反射异常。

动漫人物

这里有一种不显式使用构造函数参数的相当人为的方法。您需要扩展参数化抽象类。public&nbsp;class&nbsp;Test&nbsp;{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String&nbsp;[]&nbsp;args)&nbsp;throws&nbsp;Exception&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Generic&nbsp;g&nbsp;=&nbsp;new&nbsp;Generic(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g.initParameter(); &nbsp;&nbsp;&nbsp;&nbsp;}}import&nbsp;java.lang.reflect.ParameterizedType;public&nbsp;abstract&nbsp;class&nbsp;GenericAbstract<T&nbsp;extends&nbsp;Foo>&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;T&nbsp;parameter; &nbsp;&nbsp;&nbsp;&nbsp;@SuppressWarnings("unchecked") &nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;initParameter()&nbsp;throws&nbsp;Exception,&nbsp;ClassNotFoundException,&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InstantiationException&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Get&nbsp;the&nbsp;class&nbsp;name&nbsp;of&nbsp;this&nbsp;instance's&nbsp;type. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ParameterizedType&nbsp;pt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;(ParameterizedType)&nbsp;getClass().getGenericSuperclass(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;You&nbsp;may&nbsp;need&nbsp;this&nbsp;split&nbsp;or&nbsp;not,&nbsp;use&nbsp;logging&nbsp;to&nbsp;check &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;parameterClassName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;pt.getActualTypeArguments()[0].toString().split("\\s")[1]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Instantiate&nbsp;the&nbsp;Parameter&nbsp;and&nbsp;initialize&nbsp;it. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parameter&nbsp;=&nbsp;(T)&nbsp;Class.forName(parameterClassName).newInstance(); &nbsp;&nbsp;&nbsp;&nbsp;}}public&nbsp;class&nbsp;Generic&nbsp;extends&nbsp;GenericAbstract<Foo>&nbsp;{}public&nbsp;class&nbsp;Foo&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Foo()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Foo&nbsp;constructor..."); &nbsp;&nbsp;&nbsp;&nbsp;}}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java