Java 如何创建T类型的新对象

Java 如何创建T类型的新对象,java,generics,Java,Generics,我正在尝试制作一个T型的新对象 我试过: T h = new T(); T h = T.newInstance(); 那些不起作用。我还尝试: T h = (T)(new Object()); 这是可行的,但是h.getClass().getName()返回java.lang.Object 有没有办法在不知道类名的情况下创建该类的默认对象 编辑(来自评论): T是一个泛型。正如Jon所评论的那样,你明确地需要这个类是因为 例如,如果你有一个通用方法,你必须这样做: public void &

我正在尝试制作一个T型的新对象

我试过:

T h = new T();
T h = T.newInstance();
那些不起作用。我还尝试:

T h = (T)(new Object());
这是可行的,但是
h.getClass().getName()
返回
java.lang.Object

有没有办法在不知道类名的情况下创建该类的默认对象

编辑(来自评论):


T
是一个泛型。正如Jon所评论的那样,你明确地需要这个类是因为

例如,如果你有一个通用方法,你必须这样做:

public void <T> myMethod(Class<T> clazz) {
    T foo = clazz.newInstance();
}
class MyLinkedList<T> {
    // implementation code
} 
public void myMethod(类clazz){
T foo=clazz.newInstance();
}

如果它是泛型类,它的工作原理基本相同。您只需将类对象传递给metod,甚至传递给构造函数。

您还可以使用Prototype模式

public E makeNew(E template) throws IllegalAccessException,InstantiationException{
    E newobject=(E)template.getClass().newInstance();
    return newobject;
}

只能创建已知类型的实例
T
不是Java附带的东西,但它通常在接受类型参数(Java泛型)的类中用作内部类型参数

例如,假设您正在创建一个类型参数化的链表,即可以将任何一种数据类型用作内容的链表。如果您希望该类的实例只能包含
String
s,您可以这样实例化它:

MyLinkedList<String> list = new MyLinkedList<String>();
MyLinkedList=新建MyLinkedList();
此类类的定义需要一个类型参数,该参数将表示实例化该类时使用的任何类,并且类似于以下内容:

public void <T> myMethod(Class<T> clazz) {
    T foo = clazz.newInstance();
}
class MyLinkedList<T> {
    // implementation code
} 
类MyLinkedList{
//实现代码
} 
在该类中,您可以创建类型为T的实例,您可以使用
T T=new T()进行创建,正如您所期望的。然而,T在运行时将引用其他一些类,因为T只是一个类型参数

但是,该
T
类型将无法在类外访问


如果您没有实现一个类型参数化类,那么您必须创建一个类型为T的类来实例化它,并确保将它包含到您想要在其中使用它的任何范围中。但我不建议这样做,因为这不是很好的描述

相关:这里的
T
是泛型类型的类型参数吗?如果是这样,由于类型擦除,您将需要一个
。谷歌搜索“java反射API”@AshotKarakhanyan,如果没有OP的确认,我们无法知道这一点。如果t是一个普通类,
新的t()
。(假设存在默认构造函数)T是泛型。类似于类。假设类有一个默认构造函数,例如
类Foo{public Foo(){}}
,这将起作用。我现在得到IllegaAccessException和InstanceionException。但我们不需要泛型…:)@AshotKarakhanyan现在OP已经确认
T
是泛型类型参数。@PitaJ您的类有公共默认构造函数吗?此外,类本身必须是可访问的(公共的)。当然,与Andre的回答相同的注意事项。您需要一个无参数构造函数。当然,它是在一个泛型类中定义的,比如公共类名或公共类名