如何使switch case在Java中接受多种数据类型?

时间:2010-06-07 06:49:19

标签: java language-features switch-statement

使用Java switch case时,它只接受char和int,但我想提供字符串大小写。如何做到这一点?

6 个答案:

答案 0 :(得分:6)

你不能在交换机案例中使用字符串。 It's on its way in Java 7.

它接受的当前类型包括charbyteshortintCharacterByte,{{1} },Short或枚举类型。

来自Java语言规范:

  

Expression的类型必须是char,byte,short,int,Character,Byte,Short,Integer或枚举类型(第8.9节),否则会发生编译时错误。

     

...

     

以下所有内容必须为true,否则将导致编译时错误:

     
      
  • 与switch语句关联的每个case常量表达式必须可分配(第5.2节)到switch表达式的类型。
  •   
  • 没有开关标签为空。
  •   
  • 与switch语句关联的两个case常量表达式中没有两个可能具有相同的值。
  •   
  • 最多一个默认标签可能与同一个switch语句相关联。
  •   

答案 1 :(得分:3)

正如其他回复所述,Java(当前)不支持切换字符串值。有三种常用的方法可以达到同样的效果:

  • switch替换为if ... else if ...个语句链。 (呸)。

  • 创建并填充HashMap,将字符串映射为整数代码,然后打开代码。

  • 定义enum类型,其值的名称与字符串相同,使用EType.valueOf(String)将字符串映射到枚举值,然后打开枚举值。 (如果要求遵守枚举值的Java标识符样式规则,或者字符串包含非标识符字符,则可能会更复杂。)

  • @Pete Kirkham添加了切换字符串哈希码的“经典黑客”。但是,有一些问题:

    1. 它没有正确处理提供的字符串不是必需字符串之一的情况。 (想一想:许多字符串都散列为相同的哈希码。)

    2. 哈希码很可能是间隔很大的,因此JIT编译器必须根据哈希码值将交换机编译为一系列测试/分支。这比基于String.equals()的测试/分支更快,但对于编译为跳转表的开关,它是O(N) ...而不是O(1)

答案 2 :(得分:2)

我可以打开什么?

从Java 6开始,您只能打开以下类型:

  

JLS 14.11 The switch statement

SwitchStatement:
    switch ( Expression ) SwitchBlock
     

Expression的类型必须是charbyteshortintCharacterByteShortIntegerenum类型,或发生编译时错误。 [...]与switch语句关联的每个case常量表达式必须可分配给switch Expression的类型。


那我该怎么办?

根据您的使用情况,您可以使用enum代替String。与String不同,您可以启用enum。这是一个例子:

public class EnumSwitchSample {
    static enum Color {
        BLACK, WHITE;
    }
    public static void main(String[] args) {
        test(Color.valueOf("BLACK"));
        // "It's black!"

        test(Color.WHITE);
        // "It's white!"
    }
    static void test(Color c) {
        switch (c) {
            case BLACK:
                System.out.println("It's black!");
                break;
            case WHITE:
                System.out.println("It's white!");
                break;
        }       
    }
}

但是,Java中的enum实际上非常强大,您甚至可能不需要switch。这是一个例子:

public class EnumMemberExample {
    static enum Mood {
        SCREAM("I'M LOUD AND OBNOXIOUS!!!") {
            @Override public String say(String statement) {
                return statement.toUpperCase().replaceAll("!", "!!!");
            }
        },
        WHISPER("Ssh... Be vewy vewy quiet...") {
            @Override public String say(String statement) {
                return statement.toLowerCase().replaceAll("!", "...");
            }
        };          
        final String msg;
        Mood(String msg)    { this.msg = msg; }
        String getMessage() { return msg; }
        abstract String say(String statement);
    }
    public static void main(String[] args) {
        test(Mood.SCREAM);
        // "I'M LOUD AND OBNOXIOUS!!!"
        // "HELLO!!! HOW ARE YOU!!!"

        test(Mood.WHISPER);
        // "Ssh... Be vewy vewy quiet..."
        // "hello... how are you..."
    }
    static void test(Mood m) {
        System.out.println(m.getMessage());
        System.out.println(m.say("Hello! How are you!"));
    }
}

另见

相关问题

答案 3 :(得分:1)

switch-case是一种语言结构,旨在仅接受整数值。你不能改变它的工作方式。

答案 4 :(得分:0)

我真的很绝望你可以打开String的摘要。如果你是那种东西的话。

import java.util.zip.Adler32;

public class StringSwitch {

    public static void main(String[] args) {

        String arg;
        if (args == null || args.length == 0) {
            arg = "stackoverflow";
        } else {
            arg = args[0];
        }

        Adler32 algorithm = new Adler32();
        algorithm.update(arg.getBytes());
        int hash = (int) algorithm.getValue();

        switch (hash) {
        case 647693707:
            System.out.println("Programming Q & A");
            break;
        case 145556093:
            System.out.println("Narwhals and bacon");
            break;
        case 193790704:
            System.out.println("How do they work?");
            break;
        }
    }
}

答案 5 :(得分:0)

让我戴上我的教条帽(你用Java编写代码,所以我假设你关心OOP)

而不是问:我该怎么做错事?而是问:什么是正确的事情?在这种情况下:http://www.refactoring.com/catalog/replaceConditionalWithPolymorphism.html 并进行一些讨论:http://www.c2.com/cgi/wiki?ReplaceConditionalWithPolymorphism