Java 如何使用Objects getClass()方法设置泛型类型

Java 如何使用Objects getClass()方法设置泛型类型,java,reflection,Java,Reflection,请看下面的示例代码: Object o1= new Integer(4); ArrayList<Integer> list=new ArrayList<>(); list.add((Integer) o1); 但我希望会有更好的解决方案。由于以下原因,这是不可能的。不过,您可以做的是列出如下列表: List<Object> list = new ArrayList<>(); list.add(12); list.add("String");

请看下面的示例代码:

Object o1= new Integer(4); 
ArrayList<Integer> list=new ArrayList<>();
list.add((Integer) o1);
但我希望会有更好的解决方案。

由于以下原因,这是不可能的。不过,您可以做的是列出如下列表:

List<Object> list = new ArrayList<>();
list.add(12);
list.add("String");
List List=new ArrayList();
增加(12);
列表。添加(“字符串”);
因此,通过这种方式,您可以在列表中拥有您想要的任何对象,但由于以下原因,这是不可能的。不过,您可以做的是列出如下列表:

List<Object> list = new ArrayList<>();
list.add(12);
list.add("String");
List List=new ArrayList();
增加(12);
列表。添加(“字符串”);

所以,通过这种方式,您可以在列表中拥有您想要的任何对象。

正如@Mibac所说的,您不能用这种方式创建列表

如果100%确定列表中的所有对象都是同一类型的,则可以使用流API进行某种“强制转换”:

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);
objectO1=新整数(2);
List someList=new ArrayList();
添加(o1);
List anotherList=新建ArrayList();
addAll(someList.stream().map(o->(Integer)o.collect(Collectors.toList());
System.out.println(另一个列表);

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

如果100%确定列表中的所有对象都是同一类型的,则可以使用流API进行某种“强制转换”:

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);
objectO1=新整数(2);
List someList=new ArrayList();
添加(o1);
List anotherList=新建ArrayList();
addAll(someList.stream().map(o->(Integer)o.collect(Collectors.toList());
System.out.println(另一个列表);

您希望从中获得什么好处?在运行期间,一切基本上都是
List
。@Marvin我使用jflex扫描生成器和cup解析器生成器来制作编译器前端,对于类型检查,我使用hashmap来跟踪标识符及其类型,我相信向量化相同类型的标识符可以用来提高类型检查的速度,虽然不是很快,而且,我也对这个反射问题很好奇:)你犯的根本错误是把编译时和运行时的概念混为一谈。类型参数纯粹是编译时的事情——它们必须在编译时就知道。您不能执行类似于
ArrayList
的操作,方法调用将在运行时而不是编译时进行计算。谢谢@jasper您希望从中获得什么好处?在运行期间,一切基本上都是
List
。@Marvin我使用jflex扫描生成器和cup解析器生成器来制作编译器前端,对于类型检查,我使用hashmap来跟踪标识符及其类型,我相信向量化相同类型的标识符可以用来提高类型检查的速度,虽然不是很快,而且,我也对这个反射问题很好奇:)你犯的根本错误是把编译时和运行时的概念混为一谈。类型参数纯粹是编译时的事情——它们必须在编译时就知道。您不能执行类似于
ArrayList
的操作,方法调用将在运行时而不是编译时进行计算。谢谢@jasperI可能是错误的,但您不能强制转换它吗?(
(List)someList
)不。这是不可能的。泛型类型不能以这种方式强制转换。它产生编译时错误
error:(61,39)java:不兼容的类型:java.util.List无法转换为java.util.List
我可能错了,但您不能强制转换它吗?(
(List)someList
)不。这是不可能的。泛型类型不能以这种方式强制转换。它产生编译时错误
error:(61,39)java:不兼容的类型:java.util.List无法转换为java.util.List
,因为没有办法像我预期的那样使用反射。谢谢,按照我的意思,没有办法使用反射。非常感谢。