我有一个Map<String, Object>我存储"test"和ArrayList<Integer>.然后我尝试显示整个数组testMap.get("test")工作正常,但当我尝试显示不是整个数组而不是它的第一个元素时,它失败了error: cannot find symbol: method get(int).
public class Test {
public static void main(String[] args) {
Map<String, Object> testMap = new HashMap<>();
ArrayList<Integer> testArray = new ArrayList<>();
testArray.add(1);
testArray.add(2);
testArray.add(3);
testMap.put("test", testArray);
//works fine, output: [1, 2, 3]
System.out.println(testMap.get("test"));
//get 1st element of testArray, error
System.out.println(testMap.get("test").get(0));
}
}
Run Code Online (Sandbox Code Playgroud)
为什么会发生这种情况以及如何解决?
我的猜测是它Object的Map原因类型,但我无法改变它,ArrayList因为Map它应该存储其他类型(如String,Integer).所以我尝试过:
System.out.println((ArrayList) testMap.get("test").get(0));
Run Code Online (Sandbox Code Playgroud)
System.out.println(((List<Integer>) testMap.get("test")).get(0)) 也没用.
这仍然导致错误.
由于Map持有一种Object类型,因此需要将该结果从Object转换为List.
ArrayList<Integer> list = (ArrayList<Integer>)testMap.get("test");
System.out.println(list.get(0));
Run Code Online (Sandbox Code Playgroud)
将Object作为值是不好的做法.如果可能,请选择最具体的类型
Map<String, ArrayList<Integer>> testMap = new HashMap<>();
Run Code Online (Sandbox Code Playgroud)
这样你就可以避免演员表了.有了上述声明,您可以直接进行
System.out.println(testMap.get("test").get(0));
Run Code Online (Sandbox Code Playgroud)
如果您没有选择但必须使用对象类型的地图,则instanceof是您的朋友.这有助于您在进行任何演员表之前进行检查.这样你就可以避免了ClassCastException.
Map<String, Object> testMap = new HashMap<>();
ArrayList<Integer> testArray = new ArrayList<>();
testArray.add(1);
testArray.add(2);
testArray.add(3);
testMap.put("test", testArray);
// works fine, output: [1, 2, 3]
System.out.println(testMap.get("test"));
// get 1st element of testArray, error
if (testMap.get("test") instanceof ArrayList) {
System.out.println(((ArrayList<Integer>) testMap.get("test")).get(0));
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
173 次 |
| 最近记录: |