如何将java.lang.Object转换为ArrayList?

问题描述 投票:0回答:12

我有一个

ArrayList
形式的有效
java.lang.Object
对象。我必须再次将
Object
转换为
ArrayList
。我试过这个:

对象 obj2 = 来自某个来源。 。 ;
ArrayList al1 = new ArrayList();
al1 = (ArrayList) obj2;
System.out.println("列表2值:"+al1);

但是正在打印

null
。 我怎样才能做到这一点?

java java-6
12个回答
40
投票

您可以创建一个静态 util 方法,将任何集合转换为 Java List

public static List<?> convertObjectToList(Object obj) {
    List<?> list = new ArrayList<>();
    if (obj.getClass().isArray()) {
        list = Arrays.asList((Object[])obj);
    } else if (obj instanceof Collection) {
        list = new ArrayList<>((Collection<?>)obj);
    }
    return list;
}

您还可以混合使用以下验证:

public static boolean isCollection(Object obj) {
  return obj.getClass().isArray() || obj instanceof Collection;
}

15
投票

如果

null
在演员之前就已经是
obj2
,那么这只会导致
null
,所以你的问题比你想象的要早。 (此外,如果您要立即分配给它,则无需构造一个新的 ArrayList 来初始化
al1
。只需说
ArrayList al1 = (ArrayList) obj2;
。)


10
投票
    Object object = new Object();

    // First way
    List objects1 = new ArrayList<Object>();
    objects1.add(object);

    // second way
    List<Object> objects2 = Arrays.asList(object);

    // Third way
    List<Object> objects3 = Collections.singletonList(object);

9
投票

2021 年的答案(Java 8+)

假设您的对象是有效的 List 对象,并且如果您希望它采用特定的数据类型,请使用

Stream.of(object)
:

Object o = Arrays.asList(1, 2);
((List<Object>) o).stream().map(String::valueOf).forEach(System.out::println);

同样,您可以更改映射中的方法以转换为您需要的数据类型。


注意:这将导致

Type safety: Unchecked cast
。发生这种情况是因为强制转换是运行时检查,并且当您从某个源接收到该类型时该类型已被删除。您可以使用
@SuppressWarnings("unchecked")
并接受它。


这可能是关于该主题的一篇好文章:Reified Generics for Java


5
投票

你也可以这样做:

  new ObjectMapper().convertValue(sourceObject, new TypeReference<List<YourTargetClass>>() {});

2
投票

为了将对象转换为不可变的字符串列表,无论它是 String 还是 String 的集合,我使用了以下方法:

public static List<String> convertObjectToListOfStrings(Object obj) {
    return obj == null ? null : (obj instanceof String ? List.of((String) obj)
            : (obj.getClass().isArray() ? Arrays.asList((Object[])obj)
                    : (obj instanceof Collection ? ((Collection<?>) obj) : List.of()))
            .stream().map(String::valueOf).toList());
}

注意:此代码是通过结合已发布的两个答案来详细阐述的:https://stackoverflow.com/a/52839327/5538923https://stackoverflow.com/a/69454694/5538923.


1
投票

而是将其转换为对象数组。

Object obj2 = from some source . . ;
Object[] objects=(Object[])obj2;

1
投票

一个有趣的注释:似乎尝试从 JavaFX 应用程序线程上的对象转换为列表总是会导致 ClassCastException。

我和你有同样的问题,没有答案有帮助。玩了一段时间后,我唯一能缩小范围的就是线索。运行代码以在 UI 线程以外的任何其他线程上进行强制转换都会按预期成功,正如本节中的其他答案所建议的那样。

因此,请注意您的源代码没有在 JavaFX 应用程序线程上运行。


0
投票

转换失败(java.lang.ClassCastException:java.lang.String无法转换为java.util.ArrayList),因为你肯定有一些对象不是ArrayList。验证不同对象的类型。


0
投票

不建议从

java.lang.Object
直接转换为包含 T 元素的
ArrayList<T>
,因为这可能会导致转换异常。推荐的方法是先转换为
T
的原始数组,然后使用
Arrays.asList(T[])
从 java
javax.ws.rs.core.Response
获取实体的方法之一如下 -

    T[] t_array = response.readEntity(object);
    ArrayList<T> t_arraylist = Arrays.asList(t_array);

您仍然会收到未经检查的演员警告。


0
投票

希望这对你有帮助

import java.util.ArrayList; 
public class Demo {

 public static void main(String[] args) {
    Object obj2 =null;
    ArrayList al1 = (ArrayList) obj2;
    al1 = (ArrayList) obj2;
    System.out.println("List2 Value: " + al1);
    }
 }

obj2 对象在转换为 ArrayList 之前默认为 null。这就是为什么将 'al1' 打印为 null。


0
投票

像这样简单的事情应该有效:

Object obj = new ArrayList<>(); // your object

if (obj instanceof ArrayList<?> list) {
  System.out.println(list.isEmpty()); // true
} else {
  System.out.println("Not a list!");
}
© www.soinside.com 2019 - 2024. All rights reserved.