首页 > 解决方案 > 类型安全:类型 Map[] 的表达式需要未经检查的转换才能符合 Map[]

问题描述

我有以下两行:

Map<String,Object>[] IEXDivMap = null;       

IEXDivMap =  new Map[IEXJsonArray.length()];

并得到警告:

The expression of type Map[] needs unchecked conversion to conform to Map<String,Object>[]

有没有办法解决这个问题?

更新:

我在评论中被问到为什么我们需要一个 Map 数组开始。我们得到一系列哈希图,并将每个哈希图放在地图数组中。这是代码:

@SuppressWarnings("unchecked")
public static Map<String,Object>[] getDiv(String ticker) {
    Map<String,Object>[] IEXDivMap = null;
    try{
        String url = "https://api.IEXtrading.com/1.0/stock/" + ticker + "/dividends/1y"; 
        URL obj = new URL(url);   

        HttpURLConnection con = (HttpURLConnection) obj.openConnection();       
        con.setRequestMethod("GET");
        int responseCode = con.getResponseCode();
        if(responseCode == 404){
            System.out.println("Ticker " + ticker + " NOT FOUND in getDiv()!");
            return IEXDivMap;                
        }else if (responseCode != 200){
            System.out.println("IEX Printing All Response Header for URL: " + obj.toString() + "\n");
            Map<String, List<String>> map = con.getHeaderFields();            
            for(Map.Entry<String, List<String>> entry : map.entrySet()) {
                System.out.println("IEX " + entry.getKey() + " : " + entry.getValue());
            }
        }

        BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
        String inputLine;
        StringBuilder response = new StringBuilder();

        while ((inputLine = in.readLine()) != null) {
            response.append(inputLine);             
        }
        in.close();

        JSONArray IEXJsonArray = new JSONArray(response.toString());        
        IEXDivMap = new Map[IEXJsonArray.length()];

        for (int i = 0; i < IEXJsonArray.length(); i++) {
            IEXDivMap[i] = new HashMap<String,Object>();
            JSONObject IEXJsonObject = IEXJsonArray.getJSONObject(i);

            IEXDivMap[i].put("exDate",IEXJsonObject.getString("exDate"));
            IEXDivMap[i].put("amount",IEXJsonObject.getString("amount"));

            //System.out.println(IEXDivMap[i]);
            System.out.println(IEXDivMap[i].get("exDate") + " 0  " + IEXDivMap[i].get("amount"));
        }
    }catch(Exception e){
        System.out.println("FATAL ERROR: Something went wrong in getDiv " + e.getMessage());
        System.exit(0);
    }
    return IEXDivMap; 
}

标签: javaarraysgenericshashmap

解决方案


不幸的是,不可能以干净的方式解决问题。

干净的解决方案是创建通用数组,但由于类型擦除,这是不可能的。

为什么禁止创建通用数组?

考虑以下带有数组的示例:

Object[] arr = new String[1];
arr[0] = 10;

结果是ArrayStoreException

现在假设允许创建通用数组:

Map<String, String>[] map = new Map<>[1]; // This is illegal
Object[] objects = map;
objects[0] = new HashMap<Integer, Integer>(); // No ArrayStoreException

编译器警告说,可以将 any 放入Map数组,编译器和运行时都无法检查它。因此警告

解决方法?

引用您可以使用的Java 泛型常见问题解答:

  • 原始类型数组
  • 无界通配符参数化类型数组
  • 集合而不是数组

我个人强烈建议您考虑使用List

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

推荐阅读