我正在尝试创建一个类型为T的新对象。
我试过了:
T h = new T();
T h = T.newInstance();
那些不起作用。我也尝试过:
T h = (T)(new Object());
虽然有效,但随后h.getClass().getName()
会返回java.lang.Object
有没有办法在不知道类名的情况下制作这个类的默认对象?
编辑(来自评论):
T
是通用的。与Class<T>
一样。
答案 0 :(得分:5)
正如Jon所评论的,由于type erasure,你明确地需要这个课程。
E.g。如果你有一个通用的方法,你必须这样做:
public void <T> myMethod(Class<T> clazz) {
T foo = clazz.newInstance();
}
如果它是一个通用类,它基本上是一样的。您只需将类对象传递给metod,甚至传递给构造函数。
答案 1 :(得分:0)
您也可以使用原型模式
public E makeNew(E template) throws IllegalAccessException,InstantiationException{
E newobject=(E)template.getClass().newInstance();
return newobject;
}
答案 2 :(得分:0)
您只能创建已知类型的实例。 T
不是Java附带的东西,但它通常在带有类型参数(java泛型)的类中用作内部类型参数。
例如,假设您正在创建一个类型参数化链接列表,即可以将任何一种数据类型用作内容的链接列表。如果你想要一个只能包含String
的这个类的实例,你可以这样实例化它:
MyLinkedList<String> list = new MyLinkedList<String>();
这样一个类的定义需要一个类型参数,它将表示它实例化的任何类,并且看起来像这样:
class MyLinkedList<T> {
// implementation code
}
在该类中,您可以创建类型为T的实例,然后使用T t = new T();
进行创建,就像您期望的那样。然而,T将在运行时引用其他类,因为T只是一个类型参数。
但是,T
类型将无法在课堂外访问。
如果你没有实现类型参数化类,你必须创建一个类型为T的类来实例化它,并确保将它包含在你想要使用它的任何范围内。我不会建议这样做,因为它不是很具描述性。