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)
不幸的是,不可能以干净的方式解决此问题。
干净的解决方案是创建通用数组,但由于类型擦除而无法实现。
考虑下面的数组示例:
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)