我想要一个用于此枚举的类型化、实现特定的方法。编译器不喜欢@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);
}
理想的答案是我已经完成了注释,我需要更改一些语法,但唉。。。[悲伤的鸭子脸]。这将是应对当前挑战的另一种方式(哦,它不起作用?多么敏锐)。在方法中打字感觉不干净,所以让我们把它作为最后的手段。
abstract
compare
方法允许您使用任何引用类型作为类型参数。
您在BROKEN_ARROW
中的实现没有。因此编译器不允许这样做。这会破坏继承/多态性。
这就是你的程序无法编译的原因。
您不能使用枚举来完成此操作。事实上,任何一个类都无法做到这一点。
如果可以的话,它将打破Liskov替代原则,即"如果你可以将一个对象称为其超类型,那么你必须能够将其用作其超类型。"
考虑一下是否有人这样做:
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
}