java - list.toArray(T[] a),如果 "T"是 "runtime type"怎么办?

标签 java list generics toarray

list.toArray(T[] a),如果 T 是“运行时类型”怎么办?

Java中的“List”接口(interface),方法:T[] toArray(T[] a)
好吧,这是一个很老的问题,通常我们这样使用它:

String[] array = list.toArray(new String[0]);
String[] array = list.toArray(new String[list.size()]);

我的问题是,我在编码时不知道类型“T”是什么,类型“T”只能在运行时决定,这里是示例:

List list=...;  // no generic type declared on this List
Class<?> clazz=...; //yeah, this is the real type of the element of the list, I can sure about that

现在需要将列表转为元素类型为clazz的数组,怎么办?

可能你想知道为什么我有这种需求:
我正在对 Morphia(它是一个 java-mongoDB 框架)进行一些修改。我需要从 mongoDB 获取数据并将其设置到 POJO 的正确字段中。在某些情况下,字段类型是数组,获取的数据是一个BasicDBList实体(它扩展了ArrayList),所以BasicDBList实体必须转换成一个类型与POJO字段兼容的数组。

我查看了 ArrayList 的源代码,然后用一些丑陋的代码实现了我的目标:

List list=...;
Class<?> clazz=...;
Object targetArray=Array.newInstance(clazz, list.size());
list.toArray((Object[])targetArray);

请问有什么更好的方法吗?

最佳答案

如果您的类型仅在运行时已知,则此处没有解决方案。

Java Generics 是一种编译时检查,在运行时实际上并不存在,它被称为类型删除 http://docs.oracle.com/javase/tutorial/java/generics/erasure.html

这意味着运行时环境不会进行此类检查(例如,您可以将整数放入一般类型为字符串的列表中,使用 Object o = list.get(0) 会运行得很好)

泛型的真正意义在于提供编译时检查以防止编码错误

关于java - list.toArray(T[] a),如果 "T"是 "runtime type"怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13355364/

相关文章:

c# - 如何轻松初始化元组列表?

java - ListView 内的复选框状态在 Android 中不能按相反顺序工作

java - java中的类型转换是什么?

java - 具有可调整数组大小的 toString 方法

r - 将多个数据帧放入列表(智能方式)

swift - 具有相同通用属性和设置的多个类,如何减少重复代码?

java - 将绘画保持在 JPanel 边框内

list - Haskell 有列表切片(即 Python)吗?

ios - 泛型属性

java - 如何将整数元素添加到泛型通配符的ArrayList中?