java - 类型安全:类型 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;
}
解决方案
不幸的是,不可能以干净的方式解决问题。
干净的解决方案是创建通用数组,但由于类型擦除,这是不可能的。
为什么禁止创建通用数组?
考虑以下带有数组的示例:
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<>();
推荐阅读
- xamarin - 如何在 Xamarin webview 中加载在线 pdf 文件?
- sql - 使用触发器检查 SQL Server 中的输入时如何忽略一些无效行?
- https - 我应该如何使用 android 令牌?
- angular - Angular 中每个客户的一个构建,不同的全局风格
- php - 获取除字段 Laravel: Excel 之外的所有行
- string - 何通过多个标签拆分字符串,然后一个一个地处理它
- javascript - 如何在 React 应用程序中使用纯 JS 小部件
- json - Spring boot - 如果响应状态为 500/503,用户没有收到响应正文
- apache - Htaccess - 将 Google bot 图像重定向到正确的图像 URL
- reactjs - 为什么 TypeScript 判断 'a' | 'b' 串起来?