如何使用对象getClass()方法设置泛型类型

时间:2017-06-25 21:46:36

标签: java reflection

请看下面的示例代码:

Object o1= new Integer(4); 
ArrayList<Integer> list=new ArrayList<>();
list.add((Integer) o1);

相反,我喜欢做类似的事情:

Object o1= new Integer(4); 
ArrayList<o1.getClass().getSimpleName()> list=new ArrayList<>();
list.add((o1.getClass().getSimpleName()) o1);

o1.getClass().getSimpleName()返回&#34;整数&#34;作为一个Java.lang.String对象,我的问题是如何将这个字符串嵌入到我的代码中,以及如何使用反射,以便列表中的项类型可以在运行时确定。 可以通过switch语句执行此操作,如:

Object o1= new Integer(4); 
switch(o1.getClass().getSimpleName()){
    case "Integer":    
        ArrayList<Integer> list=new ArrayList<>();
        list.add((Integer) o1);
    case "String":
        /* some code */
}

但我希望有更好的解决方案。

2 个答案:

答案 0 :(得分:0)

由于type erasure,这是不可能的。你可以做的是有这样一个列表:

List<Object> list = new ArrayList<>();
list.add(12);
list.add("String");

所以这样你可以在列表中找到你想要的任何对象

答案 1 :(得分:0)

正如@Mibac所说,你不能以这种方式创建列表。

你可以做的是&#34;铸造&#34;使用Stream API,如果您100%确定列表中的所有对象具有相同的类型:

Object o1 = new Integer(2);
List<Object> someList = new ArrayList<>();

someList.add(o1);

List<Integer> anotherList = new ArrayList<>();
anotherList.addAll(someList.stream().map(o -> (Integer) o).collect(Collectors.toList()));

System.out.println(anotherList);