38

当我尝试一些代码时,我正在 Eclipse 上开发一个 android 应用程序

switch(String){
 ......
}

它给了我以下错误

Cannot switch on a value of type String for source level below 1.7. Only convertible int values or enum variables are permitted

所以我将编译器更改为 1.7,然后它给了我另一个错误

Android requires compiler compliance level 5.0 or 6.0. Found '1.7' instead. Please use Android Tools > Fix Project Properties.

那么,无论如何让 switch(String) 在 android 应用程序中工作?或者我别无选择,只能使用

if(){}
else if(){}
else if(){}
........
4

6 回答 6

94

随着 API 19 KitKat 的发布,您现在可以做到这一点!!!!这是现有项目的 android studio 所需的更改。确保您使用的是 JDK 1.7 或更高版本以及 Gradle 插件 0.6.1 或更高版本

android {
compileSdkVersion 19
buildToolsVersion "19.0.0"

defaultConfig {
    minSdkVersion 7
    targetSdkVersion 19
}

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
} }
于 2013-11-01T07:48:32.253 回答
38

switch关于String对象的语句是 Java 1.7 中引入的一个新特性。不幸的是,Android 需要 1.6 或 1.5 版本。这就是为什么你必须暂时忘记这种结构的原因。

您可以通过存储将要执行的方法的映射来避免使用 if-statements-chain String: Map<String, Method>。你总是Method可以用一些Handler对象封装它。在这里查看更多信息:如何删除大型 if-else-if 链

为什么不能在字符串上切换

于 2013-01-16T20:53:29.797 回答
6

你没有选择。您不能Switch使用字符串(至少现在是这样)。以下消息明确符合这一点。

Android 要求编译器合规级别为 5.0 或 6.0。改为找到“1.7”

于 2013-01-16T20:53:23.193 回答
5

您可以使用最新的 android 构建工具来做到这一点。Android 从 API 19 开始支持 Java 7 功能。

最好的部分是,即使您将 minSdkVersion 设置为低于 19,它也会起作用。引用这个android 开发者页面

请注意,对于除 try with resources 之外的所有语言功能,您都可以使用值早于 19 的 minSdkVersion。如果您想对资源使用 try,您还需要使用 19 的 minSdkVersion。

于 2015-08-26T11:42:50.923 回答
3

这是带有 java 5 或 6 的 android 的其他替代方案

public enum Command  {text, image, other};

String enumTest = "text";
try{
    Command command  = Command.valueOf(enumTest);
}
catch(Exception e){
    Log.e("Tag", "Command not found: " + enumTest);
}
switch (command){
   case image:
      break;
   case  text:
       break;
}
于 2015-04-29T18:33:02.570 回答
1

由于我假设大多数人都在使用至少 Java 7 的 Android Studio,那么现在的答案是,是的,您可以在 Android 中切换字符串,即使 minSdkVersion 版本 < 19 也是如此。这是一个如何做到这一点的示例,取自Java SE 文档

public String getTypeOfDayWithSwitchStatement(String dayOfWeekArg) {
     String typeOfDay;
     switch (dayOfWeekArg) {
         case "Monday":
             typeOfDay = "Start of work week";
             break;
         case "Tuesday":
         case "Wednesday":
         case "Thursday":
             typeOfDay = "Midweek";
             break;
         case "Friday":
             typeOfDay = "End of work week";
             break;
         case "Saturday":
         case "Sunday":
             typeOfDay = "Weekend";
             break;
         default:
             throw new IllegalArgumentException("Invalid day of the week: " + dayOfWeekArg);
     }
     return typeOfDay;
}

文档还指出:

  • 使用字符串切换通常比链式if-更快else
  • 就好像每个案例都在使用String.equals.
于 2017-02-09T01:55:48.270 回答