繁体   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