【问题标题】:Java generic Comparable where subclasses can't compare to eachotherJava 泛型 Comparable,其中子类无法相互比较
【发布时间】:2010-03-17 05:58:55
【问题描述】:
public abstract class MyAbs implements Comparable<MyAbs>

这可行,但如果 A 类和 B 类都扩展 MyAbs,我将能够相互比较它们。然而,我想要完成的却恰恰相反。

那么有没有人知道如何让泛型类型成为自己的类?乍一看好像很简单的事情……

编辑:

用一个例子进一步解释一下。假设你有一个抽象类动物,然后你用狗和蚂蚁扩展它。

我不想将蚂蚁与狗进行比较,但我想将一只狗与另一只狗进行比较。狗可能有一个变量来说明它是什么颜色,这就是我想在 compareTo 方法中使用的颜色。然而,当谈到蚂蚁时,我更愿意比较蚂蚁的大小而不是它们的颜色。

希望能解决这个问题。然而,这可能是一个设计缺陷。

【问题讨论】:

  • 如果 A 和 B 都是 MyAb,为什么您不想比较它们?如果有真正的原因,那么您的设计可能不正确,A 和/或 B 根本不应该扩展 MyAbs。
  • 与“比较 A 和 B”完全相反?不比较A和B?您的意思是您的比较器不适用于子类吗?你想做什么?

标签: java generics


【解决方案1】:

最直接的方法是:

public abstract class MyAbs<T> implements Comparable<T>

也许更有用,你去Enum风格:

public abstract class MyAbs<THIS extends MyAbs<THIS>> implements Comparable<THIS>

你也许可以忽略这个问题:

public abstract class MyAbs

外部Comparator 对我来说感觉更自然(也就是说,没有自然顺序)。

【讨论】:

  • 那个 Enum 的东西看起来很有趣,还没有真正学会使用 enum,所以要研究一下它是如何工作的。但我可能只会为每个子类实现可比较的。
【解决方案2】:

只需在 B 类上实现 Comparable,如果我正确解释您的问题,它会扩展 MyAbs。这样,B 类的对象可以与类扩展 MyAbs 的任何对象进行比较,但反之则不行。但是,如果您想要让类型参数反映具体类的类型,那么您可能应该传递 Comparable 一个新的类型参数。

IE:

public abstract class MyAbs<T> implements Comparable<T extends MyAbs>

但这当然有缺点,现在您的具体类需要将其定义更改为

public class ConcreteClass extends MyAbs<ConcreteClass>

看起来有点讨厌,但应该可以。在每个具体类上分别实现 Comparable 可能会更好。

【讨论】:

  • 那里的语法有点破。
  • 怎么样?我省略了大括号,但除此之外应该没问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多