2013-03-05 25 views
2

我使用這個代碼:任何人都可以解釋爲什麼這個工程在Java 7而不是Java 6?

public static void printMap(Map<Integer, String> obj) { 
     for (Map.Entry e : obj.entrySet()) { 
      if (e.getKey() == 3) { 
       System.out.println("OK!"); 
      } 
     } 
    } 

,並在Java 7中的作品,但在Java 6中它給上線的錯誤:

if (e.getKey() == 3) { 

任何人都可以向我解釋爲什麼我得到這個錯誤?

+1

具體有什麼樣的錯誤? – Arran 2013-03-05 17:29:48

+2

在早期版本中,我會說這是一個自動裝箱問題。但Java 6確實支持自動裝箱。你確定它實際上是Java 6嗎? – DerMike 2013-03-05 17:31:58

+0

這是因爲你不能==一個對象到一個原語。 Java7理解它是一個Integer,它會自動解除它,但是Java6將需要你參數化Entry。 – entonio 2013-03-05 17:32:28

回答

2

在Java 6中,您需要爲指定類型的變量Map.Entry

Map.Entry<Integer, String> e : obj.entrySet() 

你比較這樣的Entry的鍵或值之前。否則編譯器認爲你在​​做

if (<object of type Object> == 3) 

這是沒有意義的。

+0

那麼,這是Java 7的新資源,不是嗎? – Ascension 2013-03-05 17:40:59

+0

是的,你可以看看[type inference](http://docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html)瞭解更多信息。 – 2013-03-05 17:42:29

1

大概需要一個類型分配給您的Entry

public static void printMap(Map<Integer, String> obj) { 
    for (Map.Entry<Integer, String> e : obj.entrySet()) { 
     if (e.getKey() == 3) { 
      System.out.println("OK!"); 
     } 
    } 
} 

有Java 7中的泛型框架的變化。我不知道這是否會代碼,正如你提到的,在Java 7的工作,但我可以說,你需要指定泛型類型的Entry爲它在Java中工作6

-2

試試這個

if (e.getKey().toString().equals("3")) 

我認爲e.getKey()返回一個對象,你將它與整數進行比較。要麼將其轉換爲整數並進行比較,要麼將其轉換爲字符串並進行比較

+0

該方法是'toString()',並且不使用'=='運算符來比較Java中的字符串。 – 2013-03-05 17:35:58

+0

這將解決問題,但它不是根本問題。 – 2013-03-05 17:36:11

+0

一條短線錯誤太多:/ – A4L 2013-03-05 17:36:29

0

它是Java 6中的模板問題我認爲。

此修復它:

公共靜態無效printMap(地圖OBJ){

for (Map.Entry<Integer, String> e : obj.entrySet()) { 
     if (e.getKey() == 3) { 
      System.out.println("OK!"); 
     } 
    } 
} 

的Java 6不自動通過地圖中的參數和Map.Entry

相關問題