我有一个
ArrayList
形式的有效 java.lang.Object
对象。我必须再次将 Object
转换为 ArrayList
。我试过这个:
对象 obj2 = 来自某个来源。 。 ; ArrayList al1 = new ArrayList(); al1 = (ArrayList) obj2; System.out.println("列表2值:"+al1);
但是正在打印
null
。
我怎样才能做到这一点?
您可以创建一个静态 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;
}
如果
null
在演员之前就已经是 obj2
,那么这只会导致 null
,所以你的问题比你想象的要早。 (此外,如果您要立即分配给它,则无需构造一个新的 ArrayList 来初始化 al1
。只需说 ArrayList al1 = (ArrayList) obj2;
。)
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);
假设您的对象是有效的 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
你也可以这样做:
new ObjectMapper().convertValue(sourceObject, new TypeReference<List<YourTargetClass>>() {});
为了将对象转换为不可变的字符串列表,无论它是 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/5538923和https://stackoverflow.com/a/69454694/5538923.
而是将其转换为对象数组。
Object obj2 = from some source . . ;
Object[] objects=(Object[])obj2;
一个有趣的注释:似乎尝试从 JavaFX 应用程序线程上的对象转换为列表总是会导致 ClassCastException。
我和你有同样的问题,没有答案有帮助。玩了一段时间后,我唯一能缩小范围的就是线索。运行代码以在 UI 线程以外的任何其他线程上进行强制转换都会按预期成功,正如本节中的其他答案所建议的那样。
因此,请注意您的源代码没有在 JavaFX 应用程序线程上运行。
转换失败(java.lang.ClassCastException:java.lang.String无法转换为java.util.ArrayList),因为你肯定有一些对象不是ArrayList。验证不同对象的类型。
不建议从
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);
您仍然会收到未经检查的演员警告。
希望这对你有帮助
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。
像这样简单的事情应该有效:
Object obj = new ArrayList<>(); // your object
if (obj instanceof ArrayList<?> list) {
System.out.println(list.isEmpty()); // true
} else {
System.out.println("Not a list!");
}