【问题标题】:Cast to ArrayList转换为 ArrayList
【发布时间】:2013-05-24 17:30:36
【问题描述】:

我已经在 Map 中存储了一个 ArrayList,我正在尝试取回这个 ArrayList:

//init map with data: Map<Integer, ArrayList<MyObject>>
while(iterator.hasNext()) {
  Entry entry = iterator.next();
  ArrayList value = (ArrayList)entry.getValue();
}

将 entry.getValue() 转换为一般的 ArrayList 似乎可行,但是当我尝试将其转换为特定的 ArrayList 时:

ArrayList<MyObject> value = (ArrayList<MyObject>)entry.getValue();

编译器出错。某种“上次编译的警告”。 是否可以将其转换为我的特定 ArrayList 以便之后我可以使用 For-Each-Loop 循环它?

【问题讨论】:

  • 你是什么意思?我想遍历 Map 并希望在每个循环中获取特定的 ArrayList
  • 我虽然您是手动访问地图的值。

标签: java casting arraylist


【解决方案1】:

如果您正在创建这样的地图

Map<Integer, ArrayList<MyObject>> map = new HashMap<Integer, ArrayList<MyObject>>();

您不需要投射,因此没有WARNING

for(Entry<Integer, ArrayList<MyObject>> e : map.entrySet()) {
    Integer key = e.getKey();
    ArrayList<MyObject> value = e.getValue();
}

介绍了泛型,基本上避免了这些警告。使用泛型,我们应该定义我们想要存储在数据结构中的对象的“类型”。因此,在检索时,Java 编译器确切地知道数据结构返回的是什么对象。

【讨论】:

  • 这是一个 LinkedHashMap,我在不强制转换时得到不兼容的类型。
  • @freakout 你应该program oriented to interfaces, not to implementations。通过这样做,您将不会遇到任何铸造问题。
  • 它正在工作!问题似乎是我的 while 循环遍历数据。您的 for 循环运行良好,谢谢!
  • 是的,我知道,Eran,但是 sanbhat 在这里呈现的方式更加清晰易懂。
  • @LuiggiMendoza 但是在某些情况下使用迭代器循环是唯一可能的选择(例如,当您希望能够在迭代时从集合中删除项目的情况)。
【解决方案2】:
ArrayList<MyObject> value = e.getValue();

应该没问题,因为你已经定义了正确的类型,所以不需要强制转换:

Map<Integer, ArrayList<MyObject>>

【讨论】:

    猜你喜欢
    • 2015-08-06
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    相关资源
    最近更新 更多