使 arrayList.toArray() 返回更具体的类型

Posted

技术标签:

【中文标题】使 arrayList.toArray() 返回更具体的类型【英文标题】:make arrayList.toArray() return more specific types 【发布时间】:2011-07-01 00:06:12 【问题描述】:

所以,通常ArrayList.toArray() 会返回Object[]....但假设它是 对象CustomArraylist,如何使toArray() 返回Custom[] 的类型而不是Object[]

【问题讨论】:

ArrayList中有2个方法同名'toArray()'。从 1.5 开始,第二种方法采用类型化数组。您在寻找 1.5 之前的解决方案吗? 相关:***.com/questions/174093 【参考方案1】:

像这样:

List<String> list = new ArrayList<String>();

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

Java6之前推荐写:

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

因为无论如何内部实现都会重新分配适当大小的数组,所以最好提前做。由于 Java6 优先使用空数组,请参阅.toArray(new MyClass[0]) or .toArray(new MyClass[myList.size()])?

如果您的列表类型不正确,您需要在调用 toArray 之前进行强制转换。像这样:

    List l = new ArrayList<String>();

    String[] a = ((List<String>)l).toArray(new String[l.size()]);

【讨论】:

AFAIK:这与整个 Java 有关,无法使用泛型构造函数。所以虽然它知道你需要它来转换像 String[] 或 MyObject[] 这样的对象,但它不能自己实例化它。 如果我们想使用 double 而不是 String 怎么办?它似乎失败了......我们可以使用 Double,但是如果我想要 double 怎么办? @pbs 你不能。 Java 的泛型只支持引用类型,不支持原语。不过,自动装箱/拆箱应该让您在很大程度上忽略它们之间的区别。 我总是使用这种语法:.toArray(new String[])【参考方案2】:

其实不需要返回Object[],例如:-

    List<Custom> list = new ArrayList<Custom>();
    list.add(new Custom(1));
    list.add(new Custom(2));

    Custom[] customs = new Custom[list.size()];
    list.toArray(customs);

    for (Custom custom : customs) 
        System.out.println(custom);
    

这是我的Custom 课程:-

public class Custom 
    private int i;

    public Custom(int i) 
        this.i = i;
    

    @Override
    public String toString() 
        return String.valueOf(i);
    

【讨论】:

【参考方案3】:

将 List 转换为特定类型(例如 Long)的 Array 的较短版本:

Long[] myArray = myList.toArray(Long[]::new);

(可从 java 11 获得)

【讨论】:

这在什么 java 版本中工作?我认为它在 Java 8 中是非法的......或者对复杂类型无效 知道了,你的回答没有错,我的组织使用的是较旧的 java 版本 我认为它可以从 java 11 获得【参考方案4】:
arrayList.toArray(new Custom[0]);

http://download.oracle.com/javase/7/docs/api/java/util/ArrayList.html#toArray%28java.lang.Object[]%29

【讨论】:

【参考方案5】:
 public static <E> E[] arrayListToTypedArray(List<E> list) 

    if (list == null) 
      return null;
    
    int noItems = list.size();
    if (noItems == 0) 
      return null;
    

    E[] listAsTypedArray;
    E typeHelper = list.get(0);

    try 
      Object o = Array.newInstance(typeHelper.getClass(), noItems);
      listAsTypedArray = (E[]) o;
      for (int i = 0; i < noItems; i++) 
        Array.set(listAsTypedArray, i, list.get(i));
      
     catch (Exception e) 
      return null;
    

    return listAsTypedArray;
  

【讨论】:

如果我们有 ArrayList 并且它包含扩展 Animal 的 Dog 和 Cat 类型怎么办?如果第一个元素是Dog,下一个是Cat,似乎它会失败。它看到第一个元素,创建一个 Dog 类型的数组,添加 dog 然后尝试添加 cat,但失败了。也可能不适用于通用 E。 这是解决问题的唯一答案。它有效。唯一需要注意的是上面关于多态性的评论,但对于我们其他做 json 的人来说,它工作得很好。【参考方案6】:

我得到了答案...这似乎工作得很好

public int[] test ( int[]b )

    ArrayList<Integer> l = new ArrayList<Integer>();
    Object[] returnArrayObject = l.toArray();
    int returnArray[] = new int[returnArrayObject.length];
    for (int i = 0; i < returnArrayObject.length; i++)
         returnArray[i] = (Integer)  returnArrayObject[i];
    

    return returnArray;

【讨论】:

以上是关于使 arrayList.toArray() 返回更具体的类型的主要内容,如果未能解决你的问题,请参考以下文章

Java ArrayList toArray避免复制

Java转换Arraylist 漂浮[]

整数对最小和

int[ ] 和 Integer [ ] 有啥区别 [重复]

如何使 Identity.GetUserId() 返回 Guid 而不是字符串?

如何使这个 jquery 函数更简洁?