使用类对象实例化Java类型参数/泛型

使用类对象实例化Java类型参数/泛型,java,generics,reflection,collections,Java,Generics,Reflection,Collections,如何实例化只接受类或类对象的类型参数的Java泛型对象 例如: 通常,可以使用以下语法实例化Integer对象的ArrayList: ArrayList<Integer> foo = new ArrayList<Integer>(); 我之所以需要它,是因为我正在用Java做一些非常不寻常的事情(创建一个开源工具,用于可视化用户提供的数据结构实例/他们编写的泛型类)。下面是我将如何使用此代码的示例,其中说明了我将获得的信息: import java.util.Array

如何实例化只接受
对象的类型参数的Java泛型对象

例如: 通常,可以使用以下语法实例化
Integer
对象的
ArrayList

ArrayList<Integer> foo = new ArrayList<Integer>();
我之所以需要它,是因为我正在用Java做一些非常不寻常的事情(创建一个开源工具,用于可视化用户提供的数据结构实例/他们编写的泛型类)。下面是我将如何使用此代码的示例,其中说明了我将获得的信息:

import java.util.ArrayList;
import java.util.List;

public class ArrayListFromClass {
    // obviously this code does not work
    public static void main(String[] args) {
        Object givenObject = new Integer(4);
        // I would not know it is Integer.class, a Class<?> object would be supplied by the user/ as a generic
        Class<?> cls = givenObject.getClass();
        List<cls> bar = new ArrayList<cls>();

        // Where args[0] is "Integer.class"
        List<args[0]> foo = new ArrayList<args[0]>();

        // then I would be able to add to foo or bar with one or both of these techniques:
        // printing givenObject.getClass() gives you java.lang.Integer, don't worry about the casting not working.
        bar.add(cls.cast(givenObject));
        Integer y = 6;
        bar.add(y);
    }
}
import java.util.ArrayList;
导入java.util.List;
公共类ArrayListFromClass{
//显然,这段代码不起作用
公共静态void main(字符串[]args){
Object givenObject=新整数(4);
//我不知道它是Integer.class,类对象将由用户/作为泛型提供
类cls=givenObject.getClass();
列表栏=新的ArrayList();
//其中args[0]是“Integer.class”
List foo=new ArrayList();
//然后,我将能够使用以下一种或两种技术添加到foo或bar:
//打印givenObject.getClass()将为您提供java.lang.Integer,无需担心强制转换不起作用。
添加条(cls.cast(givenObject));
整数y=6;
加上(y);
}
}

您不必担心泛型参数。 结果表明,泛型参数实际上在运行时被擦除(请参见)

因此,您只需将其设置为
列表


这似乎是个问题,但很少有什么关系。您只需跟踪输入的类型,并确保正确删除和强制转换。大多数情况下,在使用反射时,
对象的具体类型并不重要,因为您可以间接调用方法和访问字段。

Java是静态类型的。您希望像这样实例化ArrayList的原因如下:

ArrayList<Integer> foo = new ArrayList<>();

.isInstance(Object obj)
相当于
instanceof
当你手头上有一个
时。

如果你投了反对票,请告诉我将来如何写更好/更具建设性的帖子,或者如何编辑这篇帖子。我很清楚,这不是一个可以使用Java泛型(编译时类型检查机制)的地方。因为您希望能够存储任何类型,所以只需使用
Object
。然后,你还需要在迭代时使用反射来适当地处理单个实例。这篇文章被否决了,因为这篇文章已经被问了很多次了,而且你没有显示出之前研究的证据。事实上,我很惊讶它的投票率被提高了。
ArrayList<Integer> foo = new ArrayList<>();
    String sampleString = "String";
    Class<?> clazz = sampleString.getClass();
    ...
    if (clazz.isInstance(sampleString)) {
        list.add(sampleString);
    }