可以使用switch语句来确定对象的类吗?

时间:2016-05-07 19:07:35

标签: java class switch-statement

在搜索了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语句以确定XY还是x = 5;的实例?

2 个答案:

答案 0 :(得分:8)

要使交换机正常工作,该值必须为a primitive value, a String or an Enum value。 在OO代码中,switch语句具有代码味道;通常表明你错过了使用多态的机会。

在函数式语言中,您可以使用case语句来执行您正在尝试的操作。

Java是OO所以我会利用多态性,你将拥有更清洁的设计。

<强>多态性 是一个OO概念,基本上说,如果一个是另一个的超集,那么两个对象/类可以被认为是“BE”相同。也就是说,如果对象/类满足IS-A关系。 例如,如果您有一个Car类,则FastCarVintageCar类扩展CarFastCarVintageCar都是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())

一般来说,获取实现细节通常是个坏主意。实际上,您可以在实例变量中添加实现细节,如果您需要它那么糟糕的话。