2013-03-05 32 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

相关问题