对象的映射,不能通过索引访问ArrayList元素

Ans*_*Ans 4 java arraylist

我有一个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)

为什么会发生这种情况以及如何解决?

我的猜测是它ObjectMap原因类型,但我无法改变它,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)) 也没用.

这仍然导致错误.

Sur*_*tta 7

由于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)

  • **进入的迂腐:**"如果可能,选择最具体的类型"始终可以选择最具体的类型 (4认同)