java - 对象映射,无法按索引访问 ArrayList 元素

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

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

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

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

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

将 Object 作为值是不好的做法。如果可能,选择最具体的类型。

Map<String, ArrayList<Integer>> testMap = new HashMap<>();

这样你就可以避免转换。使用上面的声明你可以直接做

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

如果您别无选择,只能使用对象类型的 map ,那么 instanceof 是您的 friend 。这有助于您在进行任何类型转换之前进行检查。这样您就可以避免 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));
    }

关于java - 对象映射,无法按索引访问 ArrayList 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48683129/

相关文章:

java - 将数组列表写入文本文件

java - 如何在Java中声明参数化对象数组?

Java执行路径名中带有空格的命令

java - 使用 iText 将 SVG 转换为 PDF,SVG 在 PDF 中未完全显示

java - 如何使用多维数组列表?

java - 安卓异常: ConcurentModificationException

Java:当不需要并发时,使用 ConcurrentSkipList* 的开销是多少?

java - 处理我的代码中未发生的异常,我应该怎么办?

java - 如何在SQL表的单列中存储超过1个项目

java - 检查 ArrayList 是否包含除一个元素之外的任何内容