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;
//...
}
// 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();
};
}
7条答案
按热度按时间r1zk6ea11#
不,switch只对数值和枚举有效。(在Java 7中,它也对字符串有效。)
听起来你可能应该在不同的子类中覆盖一个方法.或者 * 可能 * 使用枚举(它仍然可以覆盖方法)。
如果这没有帮助,请给予更多关于你正在尝试做什么的信息-最好是一个例子。
8hhllhi22#
看起来您希望使用运行时多态性。
只需在对象上调用一个方法,并在每个子类中以不同的方式实现它。
slmsl1lt3#
另一种可能性(有点黑客)是在超类中创建一个枚举,并在每个子类中实现一个抽象方法getEnum()。然后每个子类将返回枚举的不同示例。如:
字符串
然后你可以做:
型
o4hqfura4#
不,在Java中,你只能使用整数作为开关条件(edit:和
enums
,其中使用ordinal()
)。你正在寻找的解决方案(而不是讨厌的if-else
和大量的instanceof
运算符)是Visitor pattern。uplii1fm5#
Jon的回应:在Java中,枚举是对象,所以你可以通过使用枚举来实现你想做的事情,这取决于枚举到底是什么。
rvpgvaaj6#
使用
if-statements
和Superclass.isAssignableFrom(Subclass)
或Subclass.isAssignableFrom(SuperClass)
作为条件,这取决于你想要实现的目标。可能是你想要用switch statements
实现的目标的一个很好的替代品。或者使用
instanceof
运算符代替isAssignableFrom()
函数。wpcxdonn7#
你可能会很高兴知道我们知道有 * 开关表达式的模式匹配-类型模式 *:https://openjdk.org/jeps/441
字符串