【问题标题】:How to convert arraylist to an array?如何将arraylist转换为数组?
【发布时间】:2012-06-07 04:46:39
【问题描述】:

我在 Java 中有这个 ArrayList -

List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();

为了将其转换为数组,我调用了list.toArray() 方法,但它返回了Object[]。这不是我想要的。我要Map&lt;String, Object&gt;[]

我知道List.toArray(T[] a); 它不适用于参数化类型。

Spring框架中batchUpdate方法的方法签名是这样的-

int[] org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.batchUpdate(String sql, Map<String, ?>[] batchValues)

如果无法创建 Map 对象数组,为什么 Spring 使用它?那么我们应该如何使用这种方法呢?

【问题讨论】:

  • @JigarJoshi 这是我自己的问题,在我得到答案之前就关闭了。
  • 上一个问题的评论中有正确答案:No array with parameterized type
  • @AdrianShum 哦,真的吗?我想知道 Spring 开发人员在想什么..
  • 我相信与Spring无关?!

标签: java arrays spring collections


【解决方案1】:

简而言之,您不能创建具体参数化类型的数组。 This 很好地解释了正在发生的事情。 Spring 类型与Map batchValues 基本相同。参数类型仅用于文档。 Java 类型系统中的这个巨大漏洞是对性能的折衷。

【讨论】:

  • 感谢这个链接真的很有帮助。
【解决方案2】:

试试这个,

 Map<String,Object>[] ar=list.toArray(new HashMap[list.size()]);

【讨论】:

  • 这是要走的路...但是这样做仍然会失去类型安全性...我认为使用 new Map[list.size()] 会更合适,这个任何添加到列表中的地图都会正常运行。
【解决方案3】:

这样做:

Map<String, Object> [] mp = new HashMap[list.size()]; 
list.toArray(mp); 

这个答案有效。我测试过了。

我的完整测试代码如下:

import java.util.*;
public class Test {

    public static void main (String [] args) {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("Hello", "World");
        ArrayList<Map<String, Object>> list = new ArrayList<Map <String, Object>>();
        list.add(map);

        Map<String, Object> [] mp = new HashMap[list.size()]; 
        list.toArray(mp);   
        System.out.println(mp[0]);    // prints out {Hello=World}
    }
}

【讨论】:

    【解决方案4】:

    你可以这样试试:

    Map<String, Object> [] mp = list.toArray(new HashMap[list.size()]);
    

    【讨论】:

      【解决方案5】:

      HashMap[] map = list.toArray(new HashMap[0]);

      【讨论】:

        【解决方案6】:

        你做不到。

        List.toArray(T[] a) 是您唯一的选择,但它不适用于 参数化类型,因为它们不会在运行时保留。

        【讨论】:

        • 怎么样?您有 Spring 执行此操作的示例吗?
        • int[] org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.batchUpdate(String sql, Map[] batchValues)
        • 胡?那个弹簧功能做了一些完全不同的事情。阻止原作者做他想做的事情的问题是,该类型的通用部分在运行时不存在。所以你不能创建一个相同类型的新对象。
        猜你喜欢
        • 2013-03-10
        • 2011-09-18
        • 2010-09-16
        • 2013-04-27
        • 2013-05-11
        • 1970-01-01
        • 1970-01-01
        • 2015-05-16
        相关资源
        最近更新 更多