是否可以使用 switch 并在不同情况下拥有不同的子类?我想使用 switch 而不是几个 if 语句。我有一个名为指令的抽象类和具有不同类型的子类。所以我希望每个案例都是不同的子类。喜欢:
switch (instruction){
case instruction1:
case instruction2:
case instruction3:
}
等 如前所述,指令 1、2、3 是同一类的子类。
不可以,switch 仅适用于数值和枚举。 (在 Java 7 中它也适用于字符串。)
听起来你应该在不同的子类中重写一个方法......或者可能使用枚举(它仍然可以重写方法)。
如果这没有帮助,请提供有关您正在尝试执行的操作的更多信息 - 最好提供一个示例。
看起来您想改用运行时多态性。
只需调用对象的方法并在每个子类中以不同的方式实现它。
另一种可能性(有点黑客)是在超类中创建一个枚举,并创建一个抽象方法 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;
//...
}
不可以,在 Java 中只能使用整数作为切换条件(edit: 和
enums
,其中使用 ordinal()
)。您正在寻找的解决方案(而不是带有大量 if-else
运算符的令人讨厌的 instanceof
)是 访问者模式。
扩展 Jon 的回应:在 Java 中,枚举是对象,因此你可能能够通过使用枚举来实现你想要做的事情,具体取决于它是什么。也就是说,这可能不是一个非常优雅的方法。
根据您想要实现的目标,使用
if-statements
与 Superclass.isAssignableFrom(Subclass)
或 Subclass.isAssignableFrom(SuperClass)
作为条件。可能是您想要通过 switch statements
实现的目标的良好替代品。
或者使用
instanceof
运算符代替 isAssignableFrom()
函数。
您可能会很高兴知道我们有 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();
};
}