切换语句和不兼容的类型?

时间:2014-03-29 01:04:03

标签: java switch-statement incompatibletypeerror

我有一个方法,它应该采用表示条形码的字符串参数,并返回该字符串的等效数字。代码如下:

public int codeToDigit (String code) throws IOException
{                   
       switch (code)
       {
          case "||:::": return 0; 
          case ":::||": return 1; 
          case "::|:|": return 2; 
          case "::||:": return 3; 
          case ":|::|": return 4; 
          case ":|:|:": return 5; 
          case ":||::": return 6; 
          case "|:::|": return 7; 
          case "|::|:": return 8; 
          case "|:|::": return 9; 
       }
}

我对两件事感到困惑。首先,我应该把它作为默认值?现在,我只有10个占位符。但这不正确。此外,当我编译它时,我收到以下错误:

BarCode.java:56:不兼容的类型 发现:java.lang.String 必需:int        开关(代码)

他们显然是不兼容的类型?关于如何解决这个问题的任何输入?谢谢你的帮助!

编辑:很多人提到升级到Java 7,我已经完成了。我正在使用Java 7并刚刚更新了Update 51.但是,我仍然遇到同样的问题。

3 个答案:

答案 0 :(得分:2)

要回答您的问题,您不能switchString版本的java< SE 7所以你应该升级。如果没有,请转换为if / else。

其次,删除所有break语句,因为即使您解决了这个问题,这些语句也会引发编译错误。

最后,如果没有合法的回报,你应该在默认列中抛出某种错误。 IllegalArgumentException可能是合适的

答案 1 :(得分:1)

在Java 1.7+中,您会收到有关break;无法访问的其他编译器错误(由于您的return语句,它们是不必要的),如前所述。你可以删除它们,它们编译得很好。

但是,在Java 1.6及更早版本中,您会收到不兼容的类型错误。这是因为Strings in case statements were supported in Java only starting with 1.7

要解决此问题,请将Java升级到至少1.7,或者为您的代码尝试数值或枚举。

答案 2 :(得分:0)

如果可以的话,正如其他答案所述:升级到Java 7.如果没有别的,为了安全性和便利性而做(具有讽刺意味的是,这两件事可能来自相同的结果)。

但是,如果由于某种原因,升级您的Java版本不是一种选择(如果您使用的是学校的实验室机器,或者依赖于教师的话,可能不会选择升级您的Java版本。 s编译器正确处理它,你也可以创建一个包含字符串作为数据的枚举,用简单的"解析"将你的字符串转换为正确的枚举成员。方法,然后切换枚举,而不是。

这可能只会复制您的问题,但它是一种有效的方法。

我不会假装已经破解了(或者说有人)Java 1.7编译器,但足以说它生成"来自使用String对象的switch语句通常更高效的字节码来自链接的if-then-else语句" (source)。

然而,切换枚举也可以很好地工作,但我不知道你是如何设法命名来代表你的数据,就像你在这里一样。