簡體   English   中英

如何將 Java 對象轉換為整數列表?

[英]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));
    // -------------------
}

tl;博士

你不能投了整個事情,因為它是一個ListList對象是保持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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM