Java switch / case vs if issue

时间:2014-05-19 05:42:56

标签: java class oop data-structures stack

我一直在尝试使用java类来模拟 Stack 。 这里是我的类构造函数:

        public Stack(Class<?> type){

        if(type==String.class){

                //...

            }

            switch(type){

                    case (String.class):
                            //...
                    break;
                    case (Integer.class):
                            //...
                    break;

                    case (Double.class):
                            //...
                    break;

                    case (Byte.class):
                            //...
                    break;

                    default:
                    break;

            }

            this.counter = -1;

        }

但对我来说很困惑, if块工作正常。但是使用switch / case块它不会编译。

错误说

incompatible types
                switch(type){
                       ^
  required: int
  found:    Class

error: constant expression required
case (String.class):

这对于切换块中的所有情况都会重复。

如果有任何遗漏,请指点我。

5 个答案:

答案 0 :(得分:3)

Java switch / case仅适用于基元( byte,short,char和int ),Enums( from java 5 )和String( from java 7 )仅限数据类型。检查oracle教程here

  

与if-then和if-then-else语句不同,switch语句可以   有许多可能的执行路径。一个开关适用于   byte,short,char和int原始数据类型。它也适用   枚举类型(在枚举类型中讨论),String类和a   包含某些原始类型的特殊类:Character,   字节,短整数和整数(在数字和字符串中讨论)。

您可以使用以下

switch(type.getName()){

  case ("java.lang.String"):
         //...
         break;
  ...
}

答案 1 :(得分:1)

Switch-case适用于原语,Enums和String(来自java 7)数据类型。因此,在您的情况下,您可以使用class#getName返回string,如果您使用的是Java 7。

switch(type.getName()){

  case ("java.lang.String"):
         //...
         break;
  case ("java.lang.Integer"):
         //...
         break;
  ...
}

答案 2 :(得分:1)

代码中的主要问题是switch语句的错误用法。它仅适用于基本类型finalbyteshortchar常量(文字或int标记的变量) 。从Java 5开始,它还允许这些原语的相应包装类的常量变量:ByteShortCharacterInteger,并且还支持enum s,从Java 7开始,它支持常量String变量。 Java Tutorials. The switch Statement中介绍了这一点。因此,要修复当前代码,请使用if语句而不是switch

//when comparing object references, use the equals method, not ==
if (String.class.equals(type)) {
    //...
} else if (Integer.class.equals(type)) {
    //...
} else ...

来自你的评论:

  

只需要为Stack构建一个类设计,它可以使用许多数据类型。我做的有什么不好吗?

设计中的主要问题是你必须在这个长if列表中添加基本上任何Java类和自定义类,这将使你的代码真的很难看,甚至对你来说都是糟糕的噩梦。为了解决这个问题,Java从Java 5开始给我们generics。所以,你可以这样定义你的类:

class MyStack<E> {
    //implementing the stack using a generic single linked list
    class Item {
        E data;
        Item next;
    }
    private Item head;
    private Item tail;
    private int size = 0;
    public MyStack() {
    }
    public int getSize() {
        return this.size;
    }
    public void add(E e) {
        Item temp = new Item();
        temp.data = e;
        if (head == null) {
            head = temp;
        } else {
            tail.next = temp;
        }
        tail = temp;
        size++;
    }
    //add the rest of the behavior...
}

顺便说一下,Java Collections API中已经有一个Stack类,你不应该有任何具有相同Java JDK API名称的类。这就是为什么在我的例子中,堆栈类被称为MyStack

答案 3 :(得分:0)

从oralce网站我发现了这个。

  

开关使用byte,short,char和int原始数据   类型。它也适用于枚举类型(在枚举类型中讨论),   String类,以及一些特定的包装类   原始类型:字符,字节,短整数和整数(在   数字和字符串)。

答案 4 :(得分:0)

这意味着你不能在switch中使用类类型。 但是如果您需要为不同的类类型执行它,只需使用默认值..比如

...
case 1: // for string class
break;
case 2: // for integer class
break; 
... and so on