用泛型重写Java枚举中的方法



我想要一个用于此枚举的类型化、实现特定的方法。编译器不喜欢@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);
}

理想的答案是我已经完成了注释,我需要更改一些语法,但唉。。。[悲伤的鸭子脸]。这将是应对当前挑战的另一种方式(哦,它不起作用?多么敏锐)。在方法中打字感觉不干净,所以让我们把它作为最后的手段。

abstractcompare方法允许您使用任何引用类型作为类型参数。

您在BROKEN_ARROW中的实现没有。因此编译器不允许这样做。这会破坏继承/多态性。

这就是你的程序无法编译的原因。

您不能使用枚举来完成此操作。事实上,任何一个类都无法做到这一点。

如果可以的话,它将打破Liskov替代原则,即"如果你可以将一个对象称为其超类型,那么你必须能够将其用作其超类型。"

考虑一下是否有人这样做:

BrokenToy toy = BrokenToy.BROKEN_ARROW;
double cmp = toy.compare(123, 456);

这将根据BrokenToy中的契约工作,因为Java会推断T的类型为Integer。但它在运行时会失败,因为BROKEN_ARROW要求TSet<Object>

相反,您应该在类本身上声明泛型(它必须是abstract,非枚举类):

public abstract class BrokenToy<T> {
    public abstract double compare(T prop1, T prop2);
    // etc
}