我一直在尝试使用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):
这对于切换块中的所有情况都会重复。
如果有任何遗漏,请指点我。
答案 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
语句的错误用法。它仅适用于基本类型final
,byte
,short
或char
的常量(文字或int
标记的变量) 。从Java 5开始,它还允许这些原语的相应包装类的常量变量:Byte
,Short
,Character
和Integer
,并且还支持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