对象映射不能按索引访问ArrayList元素

时间:2018-02-08 10:24:03

标签: 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));
    }
}

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

我猜是Object中的Map类型导致它,但我无法将其更改为ArrayList,因为Map应该存储其他类型(如StringInteger)也是如此。所以我试过了:

System.out.println((ArrayList) testMap.get("test").get(0));

System.out.println(((List<Integer>) testMap.get("test")).get(0))也没有用。

仍导致错误。

7 个答案:

答案 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));