如何用泛型在java中实例化类实例?

如何用泛型在java中实例化类实例?,java,generics,object,Java,Generics,Object,如何用泛型在java中实例化类实例 我试图从XML文件中读取数据,然后实例化一个对象,以便将对象的其他属性(从XML文件读取)添加到对象中。我认为最简单的方法(这样我就不必读取类方法名并找到setter)是使用构造函数中的所有值实例化对象 我正在尝试这样做,所以我需要这样做:T obj=new Object(),但是要获取objects类 private static final boolean string_field = true; private static <T

如何用泛型在java中实例化类实例

我试图从XML文件中读取数据,然后实例化一个对象,以便将对象的其他属性(从XML文件读取)添加到对象中。我认为最简单的方法(这样我就不必读取类方法名并找到setter)是使用构造函数中的所有值实例化对象

我正在尝试这样做,所以我需要这样做:
T obj=new Object()
,但是要获取objects类

    private static final boolean string_field = true;

    private static <T> T getObject(Element e, String[] fieldNames, boolean[] fieldTypes) {
        Object[] values = new Object[fieldNames.length];
        for (int i=0; i<fieldNames.length; i++) {
            values[i] = (fieldTypes[i]==string_field)? getStringValue(e, fieldNames[i])
                    : getIntegerValue(e, fieldNames[i]);
        }
        return new T(values);
    }
private静态最终布尔字符串\u字段=true;
私有静态T getObject(元素e,字符串[]字段名,布尔[]字段类型){
Object[]value=新对象[fieldNames.length];
对于(int i=0;i0){

对于(int i=0;i我真的看不出你的问题,不能使用obj.getClass吗?

你不能实例化泛型类型。Java泛型有一个恼人的特性,叫做类型擦除,这基本上意味着JVM不知道在运行时泛型类或方法使用了什么类型。这是为了向后兼容pre-gen泛型类的eric版本,例如集合

您可以做的是将
类clazz
添加到参数列表中,然后用以下内容替换方法结尾:

Class<?>[] paramTypes = new Class[values.length];
for (int i = 0; i < paramTypes.length; i++) {
    paramTypes[i] = values[i].getClass();
}
return clazz.getConstructor(paramTypes).newInstance(values);
Class[]paramTypes=新类[values.length];
for(int i=0;i
如果类没有按正确顺序接受正确类型和参数数的构造函数,则会引发异常

注意事项:这仅在构造函数的参数类型与对象类型完全相同的情况下才有效。例如,如果
{“Hello”,新整数(2)}
组成,则这将只找到具有签名的
SomeClass(String,Integer)
,而不是具有签名的
SomeClass的构造函数(Object,Object)
您不能执行
新建t()
,因为在运行时,
t
实际上只是
对象
。编译器使用泛型进行类型检查(例如,您不能将
整数
放入
列表
),但随后会丢弃泛型信息。对于所有类型的参数,都有一个方法的编译副本,因此它无法知道希望实例化哪种类型


阅读了解更多信息。

您如何知道
T
包含一个构造函数,该构造函数接受单个
对象[]
参数?解决此问题的方法是传入一个抽象工厂

interface ThingFactory { // Choose an appropriate name.
    T create(Object[] values);
}

private static <T> T getObject(
    ThingFactory<T> factory, Element e, String[] fieldNames, boolean[] fieldTypes
) { 
    ...
    return factory.create(values);
}
interface ThingFactory{//选择合适的名称。
T创建(对象[]值);
}
私有静态T getObject(
ThingFactory工厂,元素e,字符串[]字段名,布尔[]字段类型
) { 
...
返回工厂。创建(值);
}

现在
T
甚至可能没有一个非常奇怪的
对象[]
构造函数。
T
可能是一个抽象类型。工厂可能会根据参数返回不同的类型。也许有时这些产品是可以缓存的不可变对象。

您可能在类型擦除方面遇到问题…?我知道这段代码是错误的,我用它来解释我打算实现的目标。我想t使用值数组中的参数值实例化类型为t的对象。@user1031312:您如何知道
t
应该是什么类型?它是根据
元素
确定的吗?如果是这样,可能是
映射,我也可能是错的,但看起来有点像您可能正在尝试重新实现。您可能是吗st改用XStream?对Daniel说:我正计划使用XML来定义我程序中的所有GUI。我想要一个助手方法来简化这个过程;它可以解析XML文件并填充一个T对象列表;可以重用代码,而不必为我计划解析的每个对象专门编写代码。不过我会看看XStream,谢谢。你能给我一个例子来说明你的意思吗?我以前尝试过将类作为参数传递,但这让我陷入了另一个困境。我这样做了
getObject(…,Class clazz)
然后尝试获取字段名和字段类型,但我被卡住了,所以我认为从XML文件中传递我要设置的值的字段名会更容易。没关系,我知道您现在正在尝试做什么,我认为最好在这里返回一组对象,或者使用两个不同的方法,一个返回一个colle一个是int的函数,一个是返回字符串的集合。另一个方法是使用包装器对象perhapsThanks,你能提供一个例子或者告诉我如何使用反射调用构造函数的正确方向吗?可以在运行时获取类型的类,这是不必要的复杂。谢谢,这正是我没有做的w、 实际上,我编写了
clazz.getConstructors()[0].newInstance(values)
。我必须确保正确使用第一个构造函数。我不明白您的对象是什么[].class会吗?当调用
getConstructor
时,必须指定所需的构造函数,JVM只能通过其签名来区分构造函数。因此,传递一个(隐式)与构造函数的参数类型相对应的
对象数组,它将获取该构造函数。在这里,看起来您需要一个将单个
对象[]
作为参数的构造函数。
对象[].class
是一个类文本;它表示与类型
对象[]
相对应的
对象。哦,我现在明白了。但实际上,我只是使用对象[]数组来存储值!!我只是一个初学者,请原谅。它实际上不是一个对象[]参数,我想如果我说的是4参数构造函数的话
interface ThingFactory { // Choose an appropriate name.
    T create(Object[] values);
}

private static <T> T getObject(
    ThingFactory<T> factory, Element e, String[] fieldNames, boolean[] fieldTypes
) { 
    ...
    return factory.create(values);
}