在搜索了SO和网络之后,我还没有在Java中找到答案。这很简单。
我有抽象类ParentClass。类X和类Y都继承自ParentClass。我还有类DataInputDialog extends JDialog
,它用于提供用于将数据输入到类X和类Y实例的用户界面。 DataInputDialog类如下所示:
public class DataInputDialog extends JDialog {
public DataInputDialog(ParentClass xOrY) {
//calls super constructor, makes basic components such as
// buttons and panels that are used in either X or Y data entry
}
}
现在我想要一个switch
语句来确定ParentClass
传递给DataInputDialog
的类型switch (xOrY.getClass().getTypeName()) {
case X.class.getTypeName();
}
。但是,我不知道如何实现这一目标。我试过了:
xOrY
以及其他一些变体,但它总是会在case语句中出现错误:它必须是一个常量String,或者它不能转换为整数。
如何获取此switch语句以确定X
是Y
还是x = 5;
的实例?
答案 0 :(得分:8)
要使交换机正常工作,该值必须为a primitive value, a String or an Enum value。 在OO代码中,switch语句具有代码味道;通常表明你错过了使用多态的机会。
在函数式语言中,您可以使用case语句来执行您正在尝试的操作。
Java是OO所以我会利用多态性,你将拥有更清洁的设计。
<强>多态性强>
是一个OO概念,基本上说,如果一个是另一个的超集,那么两个对象/类可以被认为是“BE”相同。也就是说,如果对象/类满足IS-A关系。
例如,如果您有一个Car
类,则FastCar
和VintageCar
类扩展Car
,FastCar
和VintageCar
都是Car
类因此满足IS-A关系,因此它们可以在代码中可以调用Car
的任何地方使用。
这里的含义是,如果存在Car...accelerate
,则FastCar.accelerate
存在,并且可以具有与VintageCar.accelerate
不同的特征,因此当调用accelerate
时,代码不需要知道子类型,但是调用正确的accelerate
方法。
答案 1 :(得分:0)
java中的Switch案例需要编译时常量。在您的情况下,类名在编译时不是常量。它仅在运行时确定。我认为你必须为此写出老式的'if'案例。
if(xOrY.getClass.getTypeName().equals(X.getClass.getTypeName())
一般来说,获取实现细节通常是个坏主意。实际上,您可以在实例变量中添加实现细节,如果您需要它那么糟糕的话。