【问题标题】:Overriding methods in Java Enums with Generics使用泛型覆盖 Java 枚举中的方法
【发布时间】:2015-02-20 02:54:47
【问题描述】:

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

【问题讨论】:

  • 你想做什么?您如何比较两个 Set&lt;Object&gt;s,这与 BROKEN_ARROWBrokenToy 有何关系?
  • @SotiriosDelimanolis '我怎样才能创建一个方法来比较这两个(类型)对象?'
  • 这些2指的是什么? prop1prop2?为什么他们是Set&lt;Object&gt;?你会如何比较它们?比较方法是什么?客户端代码打算如何使用compare 方法?
  • 天哪,看起来它们是可以在“比较”方法中进行比较的任意对象,并且客户端代码会从比较中得到双倍的结果。
  • 我在问一些上下文。为什么这需要在enum 内?为什么你不能只创建一个ComparatorWhat is an XY-problem?

标签: java generics enums overriding


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    你不能用枚举做到这一点。事实上,任何课程都无法做到这一点。

    如果可以的话,它会破坏Liskov substitution principle,这基本上是“如果你可以将一个对象称为它的超类型,那么你必须能够将它用作它的超类型。”

    考虑是否有人这样做:

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

    这将根据BrokenToy 中的约定起作用,因为Java 会推断TInteger 类型。但它会在运行时失败,因为BROKEN_ARROW 要求TSet&lt;Object&gt;

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

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

    【讨论】:

    • ' 在类本身上声明泛型(必须是抽象的、非枚举类)。 - 你能详细说明吗?这感觉更接近答案,但我仍然不明白......
    • 有什么办法让编译器在你写的sn-p上报错?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-23
    相关资源
    最近更新 更多