我想要一个针对此枚举的类型化,特定于实现的方法。编译器不喜欢@Override
注释,但我很困惑为什么。更重要的是,我如何制作一个比较这两个(类型)对象的方法?
public enum BrokenToy{
BROKEN_ARROW {
@Override
public <T extends Set<Object>> double compare(
T prop1, T prop2) {
return 1.0;
}
};
public abstract <T> double compare(T prop1, T prop2);
}
理想的答案是我已经把符号搞砸了,我需要改变一些语法,但唉... [悲伤的鸭脸]。 This会成为应对当前挑战的另一种方式(哦,它不起作用?有多敏感)。在方法中输入感觉不洁净,所以让我们把它看作是最后的手段。
答案 0 :(得分:4)
abstract
compare
方法允许您将任何引用类型用作类型参数。
您在BROKEN_ARROW
中的实施没有。因此编译器不允许它。它会打破继承/多态。
这就是你的程序无法编译的原因。
答案 1 :(得分:2)
您无法使用枚举执行此操作。事实上,你不能在任何课堂上做到这一点。
如果可以的话,它会破坏Liskov substitution principle,这基本上就是“如果你可以将一个对象称为超类型,那么你必须能够将它作为超类型使用。” / p>
考虑是否有人这样做:
BrokenToy toy = BrokenToy.BROKEN_ARROW;
double cmp = toy.compare(123, 456);
根据BrokenToy
中的合同,这将有效,因为Java会推断T
的类型为Integer
。但它在运行时失败,因为BROKEN_ARROW
要求T
为Set<Object>
。
相反,您应该在类本身(必须是abstract
,非枚举类)上声明泛型:
public abstract class BrokenToy<T> {
public abstract double compare(T prop1, T prop2);
// etc
}