如何将Java对象强制转换为整数列表?
一些文档不完整的库的一个方法是返回一个对象列表。我知道这个列表包含整数数组列表。详情如下:如何将Java对象强制转换为整数列表?,java,list,casting,Java,List,Casting,一些文档不完整的库的一个方法是返回一个对象列表。我知道这个列表包含整数数组列表。详情如下: List<?> result = lib.get(); Iterator<?> iterator = result.iterator(); while(iterator.hasNext()){ Object next = iterator.next(); System.out.println(next.toString()); System.out.prin
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());
}
如何将这些对象转换为ArrayList以便正确使用它们?我认为只能将对象下一步=…对象转换为java.util.Arrays$ArrayList类型,但由于它是一个私有静态类,最好将其转换为java.util.List类 比如:
List result=lib.get();
迭代器迭代器=result.Iterator();
while(iterator.hasNext()){
Object next=iterator.next();
// -------------------
列表=(列表)下一步;
System.out.println(list.get(0));
System.out.println(list.get(1));
// -------------------
}
tl;博士
您不能强制转换整个对象,因为它是一个包含整数对象的列表
。因此,循环外部列表,并将每个元素list
对象转换为list
对象
整数列表
您似乎有一个整数列表,而不是整数列表
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 );
…引发异常:
线程“main”java.lang.ClassCastException中的异常:无法将类java.util.ImmutableCollections$List12强制转换为类java.util.ArrayList(java.util.ImmutableCollections$List12和java.util.ArrayList位于加载程序“引导”的模块java.base中)
我们可以将每个元素强制转换为列表
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 ) );
}
我不知道有什么方法可以直接播放原始列表。下一行给出的编译器错误为不可转换类型
List < List < Integer > > listOfListOfIntegers = ( List < List < Integer > > ) objects;
List>listofListFinTegers=(List)对象;
假设您有一个整数列表,您只需
List<List<Integer>> newList = result.stream()
.map(e->(List<Integer>)e)
.collect(Collectors.toList());
List newList=result.stream()
.地图(e->(列表)e)
.collect(Collectors.toList());
只需将lib.get()
返回的值强制转换为List
强制转换并忽略警告?看起来您有一个整数数组列表,而不是整数列表。@BasilBourque不能是整数数组列表,因为整数数组的toString不会打印其内容。也许是一份integers@ShashwatKhanna,输出显示它是通过调用java.util.arrays.asList(…)
包装的数组集合。并不是说它在这里有什么特殊用途。它的工作原理是将它转换为(List)
。如果我将其转换为ArrayList,则会引发异常java.lang.ClassCastException:java.util.Arrays$ArrayList不能转换为java.util.ArrayList
@ZzKr我想您只需要导入正确的ArrayList
。@ZzKr是的。ArrayList是java.util.Arrays中的一个私有静态类。因为它实现了java.util.List接口,所以您可以将其强制转换为List。无需强制转换每个子列表,您可以一次性转换整个列表并完成它,请参见。Ihr看起来像OP问题中的列表是由数组创建的。asList()
,而不是List.of()
。您应该能够强制转换到数组
”内部类数组列表
(尽管我不知道您为什么要转换)。@daniu是的,我想您可以这样假设。但这将是一次黑客攻击。但是数据发布者可以随时更改为List
的另一个实现,从而破坏您的代码。除非有某种原因,否则我不会费心去处理List
这个接口证明是不够的。@BasilBourque感谢您提出的关于将其转换为混凝土类的观点。我更新了我的答案。不需要强制转换每个单独的子列表,也不需要强制转换为实际的列表类型,假设您只读取值,而不更新列表。您可以强制转换整个内容,请参见。编译器错误:List::get
需要一个int
参数。“实际参数列表和形式参数列表长度不同”@BasilBourque我只是将代码复制/粘贴回Eclipse,并在Java8和Java11上编译和执行它。我还从命令行编译和执行。没有编译器错误,输出如图所示。
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 ) );
}
List < List < Integer > > listOfListOfIntegers = ( List < List < Integer > > ) objects;
List<List<Integer>> newList = result.stream()
.map(e->(List<Integer>)e)
.collect(Collectors.toList());
@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();
}