类型安全:Map []类型的表达式需要未经检查的转换才能符合Map <String,Object> []

DCR*_*DCR 0 java arrays generics hashmap

我有以下两行:

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

IEXDivMap =  new Map[IEXJsonArray.length()];
Run Code Online (Sandbox Code Playgroud)

并得到警告:

The expression of type Map[] needs unchecked conversion to conform to Map<String,Object>[]
Run Code Online (Sandbox Code Playgroud)

有办法解决吗?

更新:

在评论中有人问我为什么我们需要一个Map数组。我们将获得一系列哈希图,并将每个哈希图放置在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; 
}
Run Code Online (Sandbox Code Playgroud)

cac*_*co3 5

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

干净的解决方案是创建通用数组,但由于类型擦除而无法实现。

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

考虑下面的数组示例:

Object[] arr = new String[1];
arr[0] = 10;
Run Code Online (Sandbox Code Playgroud)

结果是ArrayStoreException

现在想象一下,允许创建通用数组:

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

编译器警告说,任何人Map都不能将其放入数组,编译器或运行时都不能检查它。因此,警告

解决方法?

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

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

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

List<Map<String, Object>> list = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)


rad*_*ado -2

也许像这样?

import java.util.Map;
import java.util.HashMap;

public class test {
  public static void main(String[] args) {
    class MyMap extends HashMap<String,Object> { }
    MyMap[] IEXDivMap = null;       

    IEXDivMap = new MyMap[2];
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 这是答案还是猜测?这段代码的作用是什么以及为什么它可以解决问题? (2认同)