Java交换机/案例与if问题

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): //...

我一直在尝试使用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;

        }

这在开关块中的所有情况下都会重复


请告诉我这里是否缺少任何内容。

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类和自定义类,这将使您的代码非常难看、可怕,甚至是噩梦