将HashMap迭代器转换为具体类型时出现ClassCastException

Sht*_*itz 0 java processing iterator hashmap

我是processing.org和Java的新手.我试图将对象存储在HashMap中,然后迭代HashMap的值,调用存储对象上的方法.为了做到这一点,我假设我需要将迭代器向下转换为我的类的类型,但这会抛出一个ClassCastException("java.util.HashMap $ ValueIterator不能转换为sketch_oct27a $ MyClass").以下简化代码演示了此行为:

import java.util.*;

void setup() {
  HashMap m = new HashMap();

  m.put("First", new MyClass());
  m.put("Second", new MyClass());
  m.put("Third", new MyClass());

  Iterator iter = m.values().iterator();

  while (iter.hasNext()) {
   ((MyClass)iter).SaySomething(); // Throws ClassCastException
   iter.next();
  }    
}

class MyClass { 
  void SaySomething() {
    println("Something");
  }
}
Run Code Online (Sandbox Code Playgroud)

如何通过迭代器调用SaySomething()方法?

Mic*_*rdt 6

这是你使用迭代器的方法:

((MyClass)iter.next()).SaySomething();
Run Code Online (Sandbox Code Playgroud)

更好的是,使用泛型,这样你根本不需要施放:

HashMap<MyClass> m = new HashMap<MyClass>();
...
Iterator<MyClass> iter = m.values().iterator();
...
iter.next().SaySomething();
Run Code Online (Sandbox Code Playgroud)

然后你甚至可以完全跳过迭代器(实际上,这种语法只是隐藏它,它仍然隐式使用):

for(MyClass element : m.values())
{
    element.SaySomething();
}
Run Code Online (Sandbox Code Playgroud)

  • 或者是对于循环的豪华:`for(MyClass value:map.values()){m.saySomething(); }` (2认同)