nux*_*nux 7 java generics templates object instantiation
我被卡住了.来自C++,我认为这只会起作用,但事实并非如此.你能给我一个建议吗?我会尝试不会在每个用于T的类中使用某种创建方法.
public class A<T>{
private T t_;
public A(){
t_ = new T(); //error
}
}
Run Code Online (Sandbox Code Playgroud)
另外我不想让构造函数看起来像:A(Class classT){...理想情况下我希望有类似这个c ++代码的东西.
template<class T>
class A{
private:
T t_;
public:
A(){}
};
Run Code Online (Sandbox Code Playgroud)
感谢帮助.
Lou*_*man 10
除了类型擦除的问题 - 这使得在任何情况下都不可能 - 你根本无法保证T有一个暴露的,无参数的构造函数!
传统的解决方法是传递工厂对象,这些对象提供可用于获取T对象的方法.一个简单的例子就是
interface Factory<T> {
T create();
}
Run Code Online (Sandbox Code Playgroud)
然后你的班级可以得到一个Factory<T>并呼吁create()它获得更多的Ts.更复杂的示例可能需要create方法的其他参数,例如,或重载.
不太常见的解决方法包括显式反射,绕过Class<T>对象.例如,ArrayList.class.newInstance()返回一个新构造的原始ArrayList.您必须明确地传递Class对象,并且基于反射的方法比普通构造函数或工厂对象慢(即使反射速度最近有所提高).您还依赖于暴露无参数构造函数的类,但情况并非总是如此.它可以工作,但它永远不会是我所说的"愉快".
(也就是说,作为参考,有迹象表明,Java 8中的项目Lambda和朋友的情况可能会有所改变.)