0

私は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");
  }
}

イテレータを介してSaySomething()メソッドを呼び出すにはどうすればよいですか?

4

2 に答える 2

6

イテレータの使用方法は次のとおりです。

((MyClass)iter.next()).SaySomething();

さらに良いことに、ジェネリックを使用して、キャストする必要がまったくないようにします。

HashMap<MyClass> m = new HashMap<MyClass>();
...
Iterator<MyClass> iter = m.values().iterator();
...
iter.next().SaySomething();

次に、イテレータを完全にスキップすることもできます(実際には、この構文はイテレータを非表示にするだけで、暗黙的に使用されます)。

for(MyClass element : m.values())
{
    element.SaySomething();
}
于 2009-10-26T22:48:35.913 に答える
2

あなたのコードは現在これを行っています:

    ((MyClass)iter).SaySomething();

iterこれは、「インスタンスとしてキャストし、MyClassそのメソッドを呼び出します。インスタンスSaySomething()の実際のクラスはiter、インターフェイスを実装する内部クラスになるため、失敗しますjava.util.Iterator。そのクラスは、MyClassのサブクラスにはなりません。

あなたがする必要があるのは、イテレータに次の値を提供させ、その値をキャストすることです。すなわち

    ((MyClass) (iter.next())).SaySomething();

これを次のように簡略化できます。

    ((MyClass) iter.next()).SaySomething();

Java演算子の優先順位のため。

@Michaelは、ジェネリックスを使用すれば、明白な型キャストを取り除くことができると指摘しています。Java 5.0で導入された「新しい」forループ構文を使用すると、さらに単純化できます。

    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」のように聞こえますが、彼らの行動をまとめる必要があります。Java1.4.xプラットフォームは本当に時代遅れです。

于 2009-10-26T23:11:47.700 に答える