2010-02-19 2 views
0
ArrayList array = new ArrayList(); 

Iterator it1 = array.iterator(); 
while (it1.hasNext()){ 
    Myclass temp = it1.myGetterMethod(); 
    System.out.println (temp); 
} 

이것은 구현하려는 것이지만 Iterator는 일반 객체 만 반환합니다. Object.getClass()으로 전화하면 클래스는 Myclass입니다. 이것은 Iterator가 일반적이지 않다는 것을 의미합니까? 자바 문자열이 아닌 객체를 반복 할 때마다 Iterator 클래스를 확장해야합니까?Iterator에서 특정 클래스 메서드를 호출 할 수없는 이유는 무엇입니까?

답변

7

일반 ArrayList를 만들지 않았습니다.

ArrayList<MyClass> array = new ArrayList<MyClass>(); 

Iterator<MyClass> it1 = array.iterator(); 
while (it1.hasNext()) 
{ 
    MyClass temp = it1.myGetterMethod(); 
    System.out.println (temp); 
} 
+0

'Iterator'를'Iterator '으로 일반화해야합니까? 아니요. 또는 'for (MyClass c in array)'로 바로 가십시오. –

+0

@Michael Brewer-Davis : 자동으로 수행됩니다. 제네릭을 사용하는 컬렉션은 해당 반복자를 반환합니다. 그래도 올바르게 선언해야합니다. – Fredrik

+1

@ curlingdude : 이제 답변을 수락하면 어쩌면 수정해야할까요? "MyClass"와 "Myclass"를 혼합하면 "Iterator it1"선언에서 완전히 생략됩니다. – Fredrik

4

귀하의 코드

시도는 몇 가지 중요한 것들을 그리워하지만, 당신이해야 할 첫 번째 일은 Iterator.next() 호출에 의해 반환되는 값을 캐스팅 중입니다 (코드에서 누락) 또는 제네릭을 사용 컴파일러가 당신을 위해 그것을 정렬합니다. 캐스트와

: 제네릭

ArrayList array = new ArrayList(); 
...  
Iterator it1 = array.iterator(); 
while (it1.hasNext()){ 
    Myclass temp = (Myclass)it1.next() 
    System.out.println (temp); 
} 

:

ArrayList<Myclass> array = new ArrayList<Myclass>(); 
...  
Iterator<Myclass> it1 = array.iterator(); 
while (it1.hasNext()){ 
    Myclass temp = it1.next() 
    System.out.println (temp); 
} 

두 가지 대안이 뭔가를 (을 컴파일하려고하지 않았다하지만 대부분 잘해야한다) 볼 것

편집 : 다른 사람이 지적한 것처럼 foreach 구조를 사용하는 것이 대부분의 경우 가독성을 위해 바람직합니다. 최대한 초기 코드를 수정하기로 결정했습니다. A 구문은 다음과 같습니다.

ArrayList<Myclass> array = new ArrayList<Myclass>(); 
...  
for(Myclass temp : array){ 
    System.out.println (temp); 
} 
5

for 문을 사용하여 반복기의 복잡성을 숨기는 것이 좋습니다. 읽기가 훨씬 쉽습니다.

for (MyClass temp: array) 
    { 
    System.out.println (temp); 
    } 
관련 문제