使用泛型覆盖Java枚举中的方法

时间:2015-02-19 16:25:12

标签: java generics enums override

我想要一个针对此枚举的类型化,特定于实现的方法。编译器不喜欢@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会成为应对当前挑战的另一种方式(哦,它不起作用?有多敏感)。在方法中输入感觉不洁净,所以让我们把它看作是最后的手段。

2 个答案:

答案 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要求TSet<Object>

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

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