2010-06-08 47 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 2010-06-08 15:49:03

回答

4

您嘗試在iterable以內每個Iterable做點事情。這隻有在iterableIterable<? extends Iterable>時纔有意義(即它將迭代其他Iterable對象)。

但是因爲您沒有爲參數指定類型參數,所以您只知道它將遍歷某種對象(即基類型Object適用)。

你應該試試這個:

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

當朗讀它讀作 「對於iterable每個Objecto,打印o」。用Iterable代替Object這句話應該說明問題所在。

+1

+1。如果你大聲說出來,這很容易理解。假設你有'Iterable shoppingCart'。然後'for(Item o:shoppingCart){total + = o.getPrice(); }'爲shoppingCart中的每個商品「o」讀取*在總價格中加上o的價格。* – 2010-06-08 14:46:08

+0

@MarkPeters:謝謝,我將其包含在答案中。 – 2010-06-08 14:49:14

3

您的循環變量不是Iterable類型的。它應該具有收集元素的類型。由於類型可迭代的參數沒有泛型類型參數,您的項目可以重複的對象實例:

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

你迭代的迭代。所以變量'i'的類型應該是不可迭代的。如果您想在那裏使用特定類型,請使用Java Generics。

0

正如其他人所說,你試圖迭代迭代器,這根本沒有意義。您需要在for循環中使用not Iterable,但在您的示例中使用object。但是,一個更好的解決辦法是

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