6

我想在 java 中创建一个可切换的类,我可以在它上面制作类似的 switch case

public class MySwitchableClass implements Comparable<MySwitchableClass>
{
    @Override
    public int compareTo(MySwitchableClass arg0) {
    // TODO Auto-generated method stub
    return 0;
    }
}

然后我就这样使用它

    MySwitchableClass s = new MySwitchableClass();
    MySwitchableClass s1 = new MySwitchableClass();

    switch(s){
    case s1:
        //do something
        break;
        default break;
    }
4

5 回答 5

9

不可能。来自JLS

表达式的类型必须是 char、byte、short、int、Character、Byte、Short、Integer、String 或枚举类型(第 8.9 节),否则会发生编译时错误。

于 2013-09-26T09:24:57.963 回答
8

switch语句不接受类,但它接受枚举。您可以创建一个enum类型来保存类类型并将它们设置为每个类中的字段。然后可以通过在switch语句中使用的接口方法公开枚举类型。

MyClassType 枚举

public enum MyClassType {
    CLASSA, CLASSB
}

可发现的界面

public interface Discoverable {
    public MyClassType getType();
} 

A类

public class ClassA implements Discoverable {

    private MyClassType type = MyClassType.CLASSA;

    public MyClassType getType() {
        return type;
    }

}

B类

public class ClassB implements Discoverable {

    private MyClassType type = MyClassType.CLASSB;


    public MyClassType getType() {
        return this.type;
    }
}

用法

public static void main(String[] args) {
    Discoverable a = new ClassA();
    Discoverable b = new ClassB();

    switch (a.getType()) {
    case CLASSA:
        System.out.println("class a");
        break;
    case CLASSB:
        System.out.println("class b");
        break;
    }

}

更好的方法是将这个逻辑放入ClassAClassB通过接口公开。

界面变化

public interface Discoverable {
    public void doWork();

}

A 类变化

public class ClassA implements Discoverable {

    public void doWork() {
        System.out.println("class a");
    }
}

B类

public class ClassB implements Discoverable {

    public void doWork() {
        System.out.println("class b");
    }
}

用法

public static void main(String[] args) {
    Discoverable a = new ClassA();
    Discoverable b = new ClassB();
    a.doWork();    
} 
于 2013-09-26T09:32:36.013 回答
1

语句的值switch只能是原始数据类型或枚举或字符串。您正在尝试做的事情无法实施。您可以做的是在该类上调用一个函数,该函数将返回原始数据类型。

于 2013-09-26T09:26:30.737 回答
0

Java 开关适用于有限数量的数据类型,而不是自定义对象。

请参阅此处的说明(适用于 Java 7)。

如果您使用 Java 7 ,则可以覆盖Object.toString类中的方法并切换。yourInstance.toString

使用switch和实现Comparable是两件非常不同的事情。

于 2013-09-26T09:25:20.783 回答
0

感谢您的回答。我不知道 Java 像普通类一样支持这种丰富的枚举。

我使用了一个枚举并定义了所有需要的字段和方法。我还实现了所需的接口,默认情况下枚举是可切换类型。

所以,枚举可以做我需要的一切。我的枚举定义如下

public enum GearType implements ConfigurationParameter {
    Automatic("Automatic"), Manual("Manual");

    private String type;

    GearType(String _type) {
        type = _type;
    }

    @Override
    public String toString() {
        return type;
    }

    @Override
    public void doSomeFunction(Object caller) {
        //TODO function code
    }
}
于 2013-09-26T11:11:58.853 回答