使用枚举类型重载

时间:2014-12-09 15:46:31

标签: java enums overloading

是否可以使用多种枚举类型:

public enum Parameter {
    XMETRIC, YMETRIC,..

并使用这些类型重载方法?

method(Parameter.XMETRIC type) {}
method(Parameter.YMETRIC type) {}

我知道你可以使用switch case并得到相同的结果,但我发现这很奇怪,这是不可能的。

4 个答案:

答案 0 :(得分:4)

枚举常量不是类型,它们是引用相应enum类型实例的变量。所以,不,你不能将它们用作参数类型。

答案 1 :(得分:1)

使用枚举,可以覆盖每个枚举常量的方法。也可以使用带参数的构造函数。

public enum Parameter {
    XMETRIC() {
        @Override
        public void method() {
        }
    },
    YMETRIC() {
        @Override
        public void method() {
        }
    },
    ...
    ZMETRIC();

    private Parameter() {
    }

    public void method() {
    }
}

在java 8中可以使用lambdas:

public enum Parameter {
    XMETRIC(() -> { System.out.println(Parameter.this); }),
    YMETRIC(() -> { ... }),
    ...
    ZMETRIC(null);

    private final Runnable method;

    private Parameter(Runnable method) {
        this.method = method;
    }

    public void callMethod() {
        if (method != null) {
            method.run();
        }
    }
}

答案 2 :(得分:0)

ENUM本身是类型,但常量不是。

说你有:

enum Roles{
    GUEST,
    USER,
    ADMIN;
}

您可以将Roles作为参数传递给public void someMethod(Roles role)

案例

//Some code
someMethod(Roles.ADMIN);

要明确回答您的问题,不可能。常量不能表示为数据类型。

答案 3 :(得分:0)

首先,java没有运行时方法重载。 因此,根据参数的运行时类,无法在1方法和其他方法之间切换。

其次,运行时类型重载根据变量的值不起作用。

所以简而言之,没有。你不能拥有

public void someMethod(1)
public void someMethod(2)  

分别触发1或2。 就像你不能使用枚举一样。

重载java的唯一类型是编译时。

下式给出:

public class A {
}
public class B {
}

public void someMethod(A a) { System.out.println("a"); }
public void someMethod(B b) { System.out.println("a"); }

以下调用将产生以下结果:

A a = new A();
A secretB = new B();
B b = new B();

someMethod(a); // prints a
someMethod(secretB); // prints a
someMethod(b); // prints b

someMethod(null); // doesn't compile, you have to cast so A or B
someMethod((B) null); // prints b