Ваш код в настоящее время делает это:
((MyClass)iter).SaySomething();
Это говорит "приведение iter
в качестве экземпляра MyClass
и вызов его метода SaySomething()
. Это не удается, потому что фактическим классом экземпляра iter
будет некоторый внутренний класс, который реализует интерфейс java.util.Iterator
. Этот класс не будет подклассом MyClass.
Что вам нужно сделать, это заставить итератор доставить его следующее значение и привести это значение; т.е.
((MyClass) (iter.next())).SaySomething();
который вы можете упростить до:
((MyClass) iter.next()).SaySomething();
из-за приоритета оператора Java.
@ Майкл указывает, что если вы используете дженерики, вы можете избавиться от явного типа трансляции. Вы можете упростить еще больше, используя «новый» для синтаксиса цикла, представленный в Java 5.0:
HashMap<String, MyClass> m = new HashMap<String, MyClass>();
m.put("First", new MyClass());
m.put("Second", new MyClass());
m.put("Third", new MyClass());
for (MyClass mc : m.values()) {
mc.SaySomething();
}
На самом деле цикл for - это просто синтаксический сахар. Под прикрытием создается экземпляр Iterator, который используется в соответствии с вашим кодом (с исправлением). Даже выполняется приведение типа ... если JIT не может выяснить, что он может оптимизировать его.
РЕДАКТИРОВАТЬ: если вы не можете использовать Java 1.5, то вы застряли с этим по старинке. Похоже, что "processing.org" должен собрать их акт. Платформа Java 1.4.x действительно устарела.