Java 如何实现可比性多次?

Java 如何实现可比性多次?,java,generics,comparable,Java,Generics,Comparable,我正在将一些代码升级到Java5,显然不理解泛型。我有其他类实现了类似的一次,我已经能够实现了。但现在我有了一个类,由于继承的原因,它最终尝试实现两种类型的Compariable。我的情况如下: 我有以下类/接口: interface Foo extends Comparable<Foo> interface Bar extends Comparable<Bar> abstract class BarDescription implements Bar class

我正在将一些代码升级到Java5,显然不理解泛型。我有其他类实现了类似的一次,我已经能够实现了。但现在我有了一个类,由于继承的原因,它最终尝试实现两种类型的Compariable。我的情况如下:

我有以下类/接口:

interface Foo extends Comparable<Foo>

interface Bar extends Comparable<Bar>

abstract class BarDescription implements Bar

class FooBar extends BarDescription implements Foo
接口Foo扩展
接口栏可扩展
抽象类BarDescription实现了Bar
类FooBar扩展了描述实现了Foo
有了这个,我得到了一个错误“接口不能用不同的参数实现多次…”

为什么我不能在FooBar中实现compareTo(Foo-Foo),在BarDescription中实现compareTo(Bar)?这不是简单的方法重载吗


编辑:我有许多类扩展了BarDescription。如果我删除了Comparable on Bar的类型参数,将其保留为原始状态,那么在对扩展BarDescription的所有类进行排序时,会收到一系列编译器警告。用下面的通配符答案可以解决这个问题吗?这个答案看起来相当复杂,维护起来也很难理解。

编译字节码后,泛型就不存在了

这方面的限制:您不能实现/扩展两个或多个接口/类,这些接口/类在没有泛型参数的情况下是相同的,但与泛型参数不同

如果你真的想要类型安全,你可以做的是:

interface Foo<T extends Foo<?>> extends Comparable<T>
interface Bar<T extends Bar<?>> extends Comparable<T>
abstract class BarDescription<T extends Bar<?>> implements Bar<T>
class FooBar extends BarDescription<FooBar> implements Foo<FooBar>
interface Foo>扩展了可比性

抽象类BAdTrace:P>我写了两个<代码>比较器< /C> > s,并完成它。

< P>多个通用接口的实现在考虑通配符时会遇到问题。


这不取决于擦除。

相同的问题,不同的情况。您正在寻找一种称为类型擦除的东西。@row一种称为通配符的东西。@codeman73:但您在Java中根本无法做到这一点。。。Java不支持真正的参数多态性。这就是为什么当你关注“OO”而不是“Java特质”时,Java泛型基本上是毫无意义的:当然,它们对于“集合”和过程程序来说都很好(因此非常适合99%的Java开发人员的心态),但它根本就不是OO。这是我对Java中泛型的最大抱怨:你不能同时拥有可处理和可处理,从OO的角度来看,这使得泛型毫无用处。或者,换言之,Java泛型对99%的Java应用程序来说都很好,而且很有帮助,但却不适合一个特别纯粹的OO定义。@DJClayworth:一点也不。。。参数化polymorpishm在很多OO语言中都运行良好,但在Java中已经无法修复严重的错误(请参阅Wikipedia文章)。。。正是因为这个原因,OP提出了他的问题。这与纯度无关,而是关于Java提供的“参数多态性”,而它在其他几种OO语言中运行良好。这是一种工作方式。我仍在努力想办法解决这个问题。为什么我们需要我希望我的原创文章有更多具体的例子。还有,有接口不是多余的吗?是的,它是多余的。。但是Java泛型有一些问题。一个大问题是继承(超级类型是?而不是对象)。例如,不允许使用Foo Foo=new Foo()。如果您有需要与只实现Foo或Bar的其他对象进行比较的对象,那么我建议您使用Jim Kileys answer并实现两个比较器(一个用于Foo,一个用于BarDescription)。