【发布时间】:2017-04-19 19:51:15
【问题描述】:
Enum 抽象方法可以重载吗?
我已经在我的代码中尝试过,但没有任何效果。 授课类
public class Test {
public void test(String string){
System.out.println(string);
}
public void test(Object object){
System.out.println("Test1");
}
public static void main(String[] args) {
Object object = new Object();
test.test(object);
test.test("what if?");
}
}
给出预期的结果
Test1
what if?
而枚举
public enum TestEnum {
TEST1{
public void test(String string){
System.out.println(string);
}
public void test(Object object){
System.out.println("Test1");
}
},
TEST2{
public void test(Object object){
System.out.println("Test2");
}
};
public abstract void test(Object object);
}
public class Test {
public static void main(String[] args) {
Object object = new Object();
TestEnum.TEST1.test("what if?");
TestEnum.TEST1.test(object);
}
}
返回
Test1
Test1
是否有可能重载枚举方法或者我做错了什么?或者也许我应该检查覆盖方法内部的类型,然后采取相应的行动?但后来我删除 switch 语句只是为了引入另一个 switch 语句。
【问题讨论】:
-
这与枚举无关。这就是一般调用哪个方法是在编译时根据对象的类型决定的,而不是具体的对象。如果你想要这样的东西——无论是枚举还是任何其他类型——你必须在运行时使用
instanceof明确检查类型。 -
@LouisWasserman 或使用显式双重调度
-
关于枚举的事情是带有主体的值被实现为
TestEnum的匿名子类;所以它们看起来像TestEnum TEST1 = new TestEnum() { /* body */ }。因此,虽然TEST1的具体类是TestEnum$1,但引用的类型是TestEnum,因此您的代码只能访问在TestEnum上定义的方法。 -
@AndyTurner 知道了。
-
顺便说一下,在你被覆盖的方法上使用
@Override。
标签: java enums overloading overriding