[英]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.