我有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));
}
}
为什么会发生这种情况以及如何解决?
我猜是Object
中的Map
类型导致它,但我无法将其更改为ArrayList
,因为Map
应该存储其他类型(如String
,Integer
)也是如此。所以我试过了:
System.out.println((ArrayList) testMap.get("test").get(0));
System.out.println(((List<Integer>) testMap.get("test")).get(0))
也没有用。
仍导致错误。
答案 0 :(得分:7)
由于Map包含一种Object类型,因此需要将该结果从Object转换为List。
ArrayList<Integer> list = (ArrayList<Integer>)testMap.get("test");
System.out.println(list.get(0));
将Object作为值是不好的做法。如果可能,请选择最具体的类型。
Map<String, ArrayList<Integer>> testMap = new HashMap<>();
这样你就可以避免演员阵容。通过上述声明,您可以直接进行
System.out.println(testMap.get("test").get(0));
如果您没有选择但必须使用对象类型的地图,则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));
}
答案 1 :(得分:3)
我建议您将地图定义为
Map<String, ArrayList<Integer>> testMap = new HashMap<>();
如果你可以使用ArrayLists作为值......
答案 2 :(得分:3)
如果要在地图中存储混合类型的对象,则绕过Java的内部类型检查系统,并且必须自己确保一切正常。
对于编译器,testMap.get("test")
是Object
。所以你必须施展:
((ArrayList<Integer>)testMap.get("test")).get(0)
^-----------------^ This is an Object
^---------------------------------------^ We have to cast this into an ArrayList.
注意正确使用()
,如评论所述。只有这样我们才能使用.get()
。
答案 3 :(得分:2)
您需要声明Map
保留ArrayList<Integer>
而不是Object
类型,如下所示,否则,您需要进行类型转换(我不建议)< / p>
Map<String, ArrayList<Integer>> testMap = new HashMap<>();
答案 4 :(得分:1)
public class Test {
public static void main(String[] args) {
Map<String, ArrayList<Integer>> 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));
}
}
这将有效
得到了结果
[1, 2, 3]
1
答案 5 :(得分:1)
System.out.println(((List<Integer>) testMap.get("test")).get(0));
在这里,您已将对象转换为List,这是一个接口。您应该使用Arraylist对象来完成这项工作。
System.out.println(((ArrayList<Integer>) testMap.get("test")).get(0));
这样可行。
答案 6 :(得分:0)
Map<String, ArrayList<Integer>> testMap = new HashMap<String,ArrayList<Integer>>();
只有突出的变化才是您唯一需要的。将泛型作为Object始终被视为错误编码,因为它的输出将是一个Object,因此需要再次进行类型转换。
的System.out.println(testMap.get(&#34;测试&#34;。)得到(0));
错误原因是,Object方法没有get()方法的方法。正如我之前告诉过你的那样,对象会在这里返回。
所以,继续,使用泛型,这是一个很好的编码实践,它们也可以帮助你解决这些错误。
ArrayList<Integer> testArray = new ArrayList<Integer>();
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));