Java交换机/案例与if问题
我一直在尝试使用java类模拟Stack。 下面是我的类构造函数:Java交换机/案例与if问题,java,class,oop,data-structures,stack,Java,Class,Oop,Data Structures,Stack,我一直在尝试使用java类模拟Stack。 下面是我的类构造函数: public Stack(Class<?> type){ if(type==String.class){ //... } switch(type){ case (String.class): //...
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;
}
及
这在开关块中的所有情况下都会重复
请告诉我这里是否缺少任何内容。Java switch/case仅适用于原语(byte、short、char和int)、枚举(来自Java 5)和字符串(来自Java 7)数据类型。查看oracle教程 与if-then和if-then-else语句不同,switch语句可以 有许多可能的执行路径。一个开关与一个开关一起工作 byte、short、char和int基元数据类型。它也适用于 枚举类型(在枚举类型中讨论)、字符串类和 很少有特殊类包装某些基本类型:Character, 字节、短字符和整数(在数字和字符串中讨论) 你可以像下面这样使用
switch(type.getName()){
case ("java.lang.String"):
//...
break;
...
}
Java switch/case只适用于原语(byte、short、char和int)、枚举(来自Java 5)和字符串(来自Java 7)数据类型。查看oracle教程 与if-then和if-then-else语句不同,switch语句可以 有许多可能的执行路径。一个开关与一个开关一起工作 byte、short、char和int基元数据类型。它也适用于 枚举类型(在枚举类型中讨论)、字符串类和 很少有特殊类包装某些基本类型:Character, 字节、短字符和整数(在数字和字符串中讨论) 你可以像下面这样使用
switch(type.getName()){
case ("java.lang.String"):
//...
break;
...
}
我在oralce网站上找到了这个 一个开关可以处理byte、short、char和int原语数据 类型。它也适用于枚举类型(在枚举类型中讨论), String类,以及一些包装特定 基本类型:字符、字节、短字符和整数(在中讨论 数字和字符串)
我在oralce网站上找到了这个 一个开关可以处理byte、short、char和int原语数据 类型。它也适用于枚举类型(在枚举类型中讨论), String类,以及一些包装特定 基本类型:字符、字节、短字符和整数(在中讨论 数字和字符串)
这意味着您不能在开关中使用类类型。 但是如果需要为不同的类类型执行此操作,只需使用默认值即可。。像
...
case 1: // for string class
break;
case 2: // for integer class
break;
... and so on
这意味着您不能在开关中使用类类型。 但是如果需要为不同的类类型执行此操作,只需使用默认值即可。。像
...
case 1: // for string class
break;
case 2: // for integer class
break;
... and so on
开关大小写
适用于原语、枚举和字符串(来自java 7)数据类型。因此,在您的例子中,如果您使用的是Java7,您可以使用返回字符串的class#getName
switch(type.getName()){
case ("java.lang.String"):
//...
break;
case ("java.lang.Integer"):
//...
break;
...
}
开关大小写
适用于原语、枚举和字符串(来自java 7)数据类型。因此,在您的例子中,如果您使用的是Java7,您可以使用返回字符串的class#getName
switch(type.getName()){
case ("java.lang.String"):
//...
break;
case ("java.lang.Integer"):
//...
break;
...
}
代码中的主要问题是
开关
语句的错误使用。它只适用于原语类型byte
、short
、char
或int
中的常量(final
标记变量)。自Java 5以来,它还允许这些原语的各个包装类的常量变量:Byte
、Short
、Character
和Integer
,并且还支持enum
s,自Java 7以来,它支持常量String
变量。这是一本书。因此,要修复当前代码,请使用if
语句而不是switch
:
//when comparing object references, use the equals method, not ==
if (String.class.equals(type)) {
//...
} else if (Integer.class.equals(type)) {
//...
} else ...
根据您的评论: 只需要为堆栈构建一个类设计,它可以使用多种数据类型。我做了什么坏事吗
设计的主要问题是,您必须在这个长的
if
列表中添加基本上任何Java类和自定义类,这将使您的代码非常难看、可怕,甚至对您来说也是一场噩梦。为了解决这个问题,Java从Java5开始就给了我们。因此,您可以这样定义您的类:
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...
}
类MyStack{
//使用通用单链表实现堆栈
类项目{
E数据;
下一项;
}
私人物品主管;
私人物品尾部;
私有整数大小=0;
公共MyStack(){
}
公共int getSize(){
返回此.size;
}
公共空间添加(E){
项目温度=新项目();
温度数据=e;
if(head==null){
压头=温度;
}否则{
tail.next=温度;
}
尾=温度;
大小++;
}
//添加行为的其余部分。。。
}
顺便说一下,Java Collections API中已经有一个类,您不应该有任何与Java JDK API同名的类。这就是为什么在我的示例中,stack类被称为
MyStack
代码中的主要问题是switch
语句的错误使用。它只适用于原语类型byte
、short
、char
或int
中的常量(final
标记变量)。自Java 5以来,它还允许这些原语的各个包装类的常量变量:Byte
、Short
、Character
和Integer
,并且还支持enum
s,自Java 7以来,它支持常量String
变量。这是一本书。因此,要修复当前代码,请使用if
语句而不是switch
:
//when comparing object references, use the equals method, not ==
if (String.class.equals(type)) {
//...
} else if (Integer.class.equals(type)) {
//...
} else ...
根据您的评论: 只需要为堆栈构建一个类设计,它可以使用多种数据类型。我做了什么坏事吗
设计的主要问题是,您必须在这个长的
if
列表中添加基本上任何Java类和自定义类,这将使您的代码非常难看、可怕,甚至是噩梦