문제

저는 Processing.org와 Java를 처음 접했습니다. 해시 맵에 객체를 저장하려고 시도한 다음 해시 맵의 값을 반복하여 저장된 객체에서 메소드를 호출합니다. 그렇게하려면 반복자를 내 클래스 유형으로 다운 캐스트해야한다고 가정하지만 클래스 캐스트 렉스 션 ( "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");
  }
}

반복자를 통해 saymething () 메소드를 어떻게 호출합니까?

도움이 되었습니까?

해결책

반복기를 사용하는 방법입니다.

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

다른 팁

코드는 현재 다음을 수행합니다.

    ((MyClass)iter).SaySomething();

이것은 "캐스트"라고 말합니다 iter 인스턴스로 MyClass 그리고 그것의 전화 SaySomething() 방법. 이것은 실제 클래스의 클래스이기 때문에 실패합니다 iter 인스턴스는 인터페이스를 구현하는 내부 클래스입니다. java.util.Iterator. 그 클래스는 MyClass의 서브 클래스가 아닙니다.

당신이해야 할 일은 반복자가 다음 가치를 전달하고 그 가치를 캐스팅하도록하는 것입니다. 즉

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

단순화 할 수 있습니다.

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

Java 운영자 우선으로 인해.

@Michael은 제네릭을 사용하면 명백한 typecast를 제거 할 수 있다고 지적합니다. 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 루프는 단지 구문 설탕입니다. 표지 아래에서 반복자 인스턴스가 코드 (수정과 함께)에 따라 생성되고 사용됩니다. JIT가 그것을 최적화 할 수 있음을 알아낼 수 없다면 유형 캐스트조차 수행 중입니다.

편집 : Java 1.5를 사용할 수 없다면 구식 방식 으로이 작업을 수행하는 데 갇혀 있습니다. "Processing.org"와 같은 소리는 행동을 함께해야합니다. Java 1.4.x 플랫폼은 실제로 구식입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top