如何创建一个T类型的新对象

时间:2014-02-12 16:32:25

标签: java generics

我正在尝试创建一个类型为T的新对象。

我试过了:

T h = new T();
T h = T.newInstance();

那些不起作用。我也尝试过:

T h = (T)(new Object());

虽然有效,但随后h.getClass().getName()会返回java.lang.Object

有没有办法在不知道类名的情况下制作这个类的默认对象?

编辑(来自评论):

T是通用的。与Class<T>一样。

3 个答案:

答案 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的类来实例化它,并确保将它包含在你想要使用它的任何范围内。我不会建议这样做,因为它不是很具描述性。

相关问题