将 switch 与子类一起使用?

问题描述 投票:0回答:7

是否可以使用 switch 并在不同情况下拥有不同的子类?我想使用 switch 而不是几个 if 语句。我有一个名为指令的抽象类和具有不同类型的子类。所以我希望每个案例都是不同的子类。喜欢:

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

等 如前所述,指令 1、2、3 是同一类的子类。

java switch-statement
7个回答
6
投票

不可以,switch 仅适用于数值和枚举。 (在 Java 7 中它也适用于字符串。)

听起来你应该在不同的子类中重写一个方法......或者可能使用枚举(它仍然可以重写方法)。

如果这没有帮助,请提供有关您正在尝试执行的操作的更多信息 - 最好提供一个示例。


4
投票

看起来您想改用运行时多态性。

只需调用对象的方法并在每个子类中以不同的方式实现它。


1
投票

另一种可能性(有点黑客)是在超类中创建一个枚举,并创建一个抽象方法 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;
//...
}

0
投票

不可以,在 Java 中只能使用整数作为切换条件(edit: 和

enums
,其中使用
ordinal()
)。您正在寻找的解决方案(而不是带有大量
if-else
运算符的令人讨厌的
instanceof
)是 访问者模式


0
投票

扩展 Jon 的回应:在 Java 中,枚举是对象,因此你可能能够通过使用枚举来实现你想要做的事情,具体取决于它是什么。也就是说,这可能不是一个非常优雅的方法。


0
投票

根据您想要实现的目标,使用

if-statements
Superclass.isAssignableFrom(Subclass)
Subclass.isAssignableFrom(SuperClass)
作为条件。可能是您想要通过
switch statements
实现的目标的良好替代品。

或者使用

instanceof
运算符代替
isAssignableFrom()
函数。


0
投票

您可能会很高兴知道我们有 Switch 的模式匹配 开关表达式 - 类型模式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();
    };
}
© www.soinside.com 2019 - 2024. All rights reserved.