[英]Instantiate generic type in java
我被卡住了。 来自C ++,我认为这只会起作用,但事实并非如此。 你能给我一个建议吗? 我会尝试不会在每个用于T的类中使用某种创建方法。
public class A<T>{
private T t_;
public A(){
t_ = new T(); //error
}
}
另外我不想让构造函数看起来像:A(Class classT){...理想情况下我希望有类似这个c ++代码的东西。
template<class T>
class A{
private:
T t_;
public:
A(){}
};
感谢帮助。
除了类型擦除的问题 - 这使得在任何情况下都不可能 - 你根本无法保证T
有一个暴露的,无参数的构造函数!
传统的解决方法是传递工厂对象 ,这些对象提供可用于获取T
对象的方法。 一个简单的例子就是
interface Factory<T> {
T create();
}
然后你的类可以得到一个Factory<T>
并在其上调用create()
以获得更多的T
s。 更复杂的示例可能需要create
方法的其他参数,例如,或重载。
不太常见的解决方法包括显式反射,传递Class<T>
对象。 例如, ArrayList.class.newInstance()
返回一个新构造的原始ArrayList
。 您必须显式传递Class
对象,并且基于反射的方法比普通构造函数或工厂对象慢(即使反射速度最近有所提高)。 您还依赖于暴露无参数构造函数的类,但情况并非总是如此。 它可以工作,但它从来就不是我所说的“愉快”。
(也就是说,作为参考,有迹象表明,Java 8中的项目Lambda和朋友的情况可能会有所改变。)
你不能用Java做这些事情。 阅读有关类型擦除的信息: http : //docs.oracle.com/javase/tutorial/java/generics/erasure.html
很抱歉让你失望,但这在没有构造函数的java中几乎是不可能的。
Java在运行时丢弃通用信息(参见类型擦除)
试试这个:
private <E extends ISomething> E createInstance(Class<E> clazz) {
E ret;
try {
ret = clazz.newInstance();
ret.setSomething(something);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return ret;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.