java 在子类中使用switch?

tquggr8v  于 2023-11-15  发布在  Java
关注(0)|答案(7)|浏览(115)

有没有可能使用switch并有不同的子类作为case?我想使用switch而不是几个if语句。我有一个抽象类叫做instruction和不同类型的子类。所以我希望每个case都是一个不同的子类。比如:

switch (instruction){
    case instruction1:
    case instruction2:
    case instruction3:
}

字符串
等等,因为所述分类1、2、3是同一类的子类。

r1zk6ea1

r1zk6ea11#

不,switch只对数值和枚举有效。(在Java 7中,它也对字符串有效。)
听起来你可能应该在不同的子类中覆盖一个方法.或者 * 可能 * 使用枚举(它仍然可以覆盖方法)。
如果这没有帮助,请给予更多关于你正在尝试做什么的信息-最好是一个例子。

8hhllhi2

8hhllhi22#

看起来您希望使用运行时多态性。
只需在对象上调用一个方法,并在每个子类中以不同的方式实现它。

slmsl1lt

slmsl1lt3#

另一种可能性(有点黑客)是在超类中创建一个枚举,并在每个子类中实现一个抽象方法getEnum()。然后每个子类将返回枚举的不同示例。如:

abstract class Super
{
enum Type {ONE, TWO, THREE};

abstract Type getType();
}

public class ChildOne extends Super
{
public Type getType()
{
return Type.ONE;
}
}

public class ChildTwo extends Super
{
public Type getType()
{
return Type.TWO;
}
}

字符串
然后你可以做:

Super someClass;
switch(someClass.getType())
{
case ONE:
//domSomething
break;

case TWO:
//domSomeOtherThin
break;
//...
}

o4hqfura

o4hqfura4#

不,在Java中,你只能使用整数作为开关条件(edit:和enums,其中使用ordinal())。你正在寻找的解决方案(而不是讨厌的if-else和大量的instanceof运算符)是Visitor pattern

uplii1fm

uplii1fm5#

Jon的回应:在Java中,枚举是对象,所以你可以通过使用枚举来实现你想做的事情,这取决于枚举到底是什么。

rvpgvaaj

rvpgvaaj6#

使用if-statementsSuperclass.isAssignableFrom(Subclass)Subclass.isAssignableFrom(SuperClass)作为条件,这取决于你想要实现的目标。可能是你想要用switch statements实现的目标的一个很好的替代品。
或者使用instanceof运算符代替isAssignableFrom()函数。

wpcxdonn

wpcxdonn7#

你可能会很高兴知道我们知道有 * 开关表达式的模式匹配-类型模式 *:https://openjdk.org/jeps/441

// from Java 17 as preview & from Java 21 as stable

static String formatterPatternSwitch(Object obj) {
    return switch (obj) {
        case Integer i -> String.format("int %d", i);
        case Long l    -> String.format("long %d", l);
        case Double d  -> String.format("double %f", d);
        case String s  -> String.format("String %s", s);
        default        -> obj.toString();
    };
}

字符串

相关问题