[英]How do I cast a Java Object into a List of integers?
一些文档记录不足的库的一种方法正在返回给我一个对象列表。 我知道该列表包含整数的 ArrayLists。 如下:
List<?> result = lib.get();
Iterator<?> iterator = result.iterator();
while(iterator.hasNext()){
Object next = iterator.next();
System.out.println(next.toString());
System.out.println(next.getClass());
}
得到我
[0, 0]
class java.util.Arrays$ArrayList
[0, 1]
class java.util.Arrays$ArrayList
[0, 2]
class java.util.Arrays$ArrayList
如何将这些对象转换为 ArrayList 以便我可以正确使用它们?
我认为您只能将Object next = ... object 转换为java.util.Arrays$ArrayList类型,但因为它是一个私有静态类,所以最好将其转换为java.util.List类。
喜欢:
List<?> result = lib.get();
Iterator<?> iterator = result.iterator();
while(iterator.hasNext()){
Object next = iterator.next();
// -------------------
List<Integer> list = (List<Integer>) next;
System.out.println(list.get(0));
System.out.println(list.get(1));
// -------------------
}
你不能投了整个事情,因为它是一个List
的List
对象是保持Integer
对象(显然)。 因此循环外部列表,并将每个元素List
对象强制转换为List< Integer >
对象。
您似乎有一个整数列表列表,而不是整数列表。
List < Object > objects = new ArrayList <> ( 3 );
objects.add ( List.of ( 0 , 0 ) );
objects.add ( List.of ( 0 , 1 ) );
objects.add ( List.of ( 0 , 2 ) );
System.out.println ( objects );
[[0, 0], [0, 1], [0, 2]]
不幸的是,您不能像其他答案中建议的那样简单地强制转换为具体类型,因为我们不知道具体类型。 我们可以假设我们有一个List
,但没有一个ArrayList
。
请参阅此示例。 List.of
方法生成一个实现List
的未指定类的对象。 我们可以在这里看到,无论使用什么具体类,它都不是ArrayList
。
List < Object > objects = new ArrayList <> ( 3 );
objects.add ( List.of ( 0 , 0 ) );
objects.add ( List.of ( 0 , 1 ) );
objects.add ( List.of ( 0 , 2 ) );
System.out.println ( objects );
Iterator < ? > iterator = objects.iterator ();
while ( iterator.hasNext () )
{
Object next = iterator.next ();
List < Integer > list = ( ArrayList < Integer > ) next;
System.out.println ( list.get ( 0 ) );
System.out.println ( list.get ( 1 ) );
}
...抛出异常:
线程“main”中的异常 java.lang.ClassCastException:类 java.util.ImmutableCollections$List12 不能转换为类 java.util.ArrayList(java.util.ImmutableCollections$List12 和 java.util.ArrayList 在模块 java.base 中加载程序“引导程序”)
我们可以将每个元素转换为List< Integer >
。
List < Object > objects = new ArrayList <> ( 3 );
objects.add ( List.of ( 0 , 0 ) );
objects.add ( List.of ( 0 , 1 ) );
objects.add ( List.of ( 0 , 2 ) );
System.out.println ( objects );
Iterator < ? > iterator = objects.iterator ();
while ( iterator.hasNext () )
{
Object next = iterator.next ();
List < Integer > list = ( List < Integer > ) next;
System.out.println ( list.get ( 0 ) );
System.out.println ( list.get ( 1 ) );
}
跑的时候。
[[0, 0], [0, 1], [0, 2]]
0
0
0
1
0
2
我不知道直接投射原始列表的方法。 下一行给出了inconvertible types
的编译器错误。
List < List < Integer > > listOfListOfIntegers = ( List < List < Integer > > ) objects;
假设你有一个整数列表的列表,你可以简单地做
List<List<Integer>> newList = result.stream()
.map(e->(List<Integer>)e)
.collect(Collectors.toList());
只需将lib.get()
返回的值lib.get()
为List<List<Integer>>
。
@SuppressWarnings("unchecked")
List<List<Integer>> result = (List<List<Integer>>) lib.get();
证明
// Simulate lib.get() and prove that it is same as question code
List<?> result = Arrays.asList(Arrays.asList(0, 0),
Arrays.asList(0, 1),
Arrays.asList(0, 2));
for (Object next : result) {
System.out.println(next);
System.out.println(next.getClass());
}
// Fix it
@SuppressWarnings("unchecked")
List<List<Integer>> fixedResult = (List<List<Integer>>) result;
// Print the fixed result
for (List<Integer> list : fixedResult) {
for (int value : list)
System.out.print(value + " ");
System.out.println();
}
输出
[0, 0]
class java.util.Arrays$ArrayList
[0, 1]
class java.util.Arrays$ArrayList
[0, 2]
class java.util.Arrays$ArrayList
0 0
0 1
0 2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.