2010-06-08 4 views
1
private static void printIterable(Iterable iterable) { 

    // ERROR: "Type mismatch: cannot convert from element type Object to Iterable" 
    for (Iterable i : iterable) { 
     System.out.println(i); 
    } 

} 

컴파일러는 무엇을 말하고 있습니까? 그것의 반복 할 수있는 개체가 아닙니다.이 인쇄 가능한 방법에있어 문제점은 무엇입니까?

+0

새로운 코드에서 원시 타입을 사용하지 마십시오 (당신이 원하는 객체와 문자열 바꾸기)입니다 : http://stackoverflow.com/questions/2770321/what-is -a-raw-type-and-why-shouldnt-we-use-it – polygenelubricants

답변

4

각각에 안에있는 Iterable에 대한 작업을 시도합니다. iterableIterable<? extends Iterable> (즉, 다른 Iterable 개체를 반복하는 경우) 인 경우에만 의미가 있습니다.

그러나 인수에 형식 인수를 지정하지 않았으므로 어떤 종류의 개체 (예 : 기본 형식 Object이 적용 가능)를 반복한다는 것을 알고 있습니다.

이 작업을 시도해야합니다 :

for (Object o : iterable) { 
    System.out.println(o); 
} 

는 "iterable의 각 Objecto, 인쇄 o은"과 같이 소리내어 읽을 때. 해당 문장의 ObjectIterable으로 바꾸면 문제가 무엇인지 설명해야합니다.

+1

+1. 큰소리로 말하면 이해하기 쉽습니다. 'Iterable shoppingCart'라고 가정 해 봅시다. 그러면 for (item o : shoppingCart) {total + = o.getPrice(); }'shoppingCart의 각 항목 "o"에 대해 o 값을 합계에 더합니다. * –

+0

@MarkPeters : 감사합니다. 대답에 포함 시켰습니다. –

3

루프 변수의 유형이 반복 가능하지 않습니다. 컬렉션 요소 유형을 가지고 있다고 가정합니다. 유형의 Iterable의 매개 변수가없는 제네릭 형식 인수가 없기 때문에, 당신의 항목은 개체 인스턴스로 반복 될 수있다 : 당신은 반복 가능한 반복되는

for (Object o : iterable) { 
    System.out.println(o); 
} 
1

. 그래서 변수 'i'의 타입은 Iterable이 아닌 객체 여야합니다. 특정 유형이 있으면 Java Generics를 사용하십시오.

0

다른 사람들이 말했듯이, 반복자를 반복하려고 시도하면 전혀 이해가되지 않을 것입니다. for 루프에서는 Iterable이 아니라 예제에서는 객체를 사용해야합니다. 그러나 훨씬 더 나은 솔루션

private static void printIterable(Iterable<String> iterable) { 

    // ERROR: "Type mismatch: cannot convert from element type Object to Iterable" 
    for (String i : iterable) { 
     System.out.println(i); 
    } 
} 

관련 문제