我有一组都共享一些公共(public)属性的类,因此我使它们都扩展了一个公共(public)基类BaseEntity。所以我有例如Foo extends BaseEntityBar extends BaseEntity

我还希望这些FooBar对象的列表可排序,因此我实现了Comparable。我将类定义为Foo extends BaseEntity implements Comparable<Foo>Bar extends BaseEntity implements Comparable<Bar>,对FooBar的列表进行排序按预期方式进行-当然,在不同的子类中,排序的详细信息也有所不同。但是,当我事先不知道是否要使用FooBar时,我无法弄清楚如何进行排序。例如,此代码无法编译:

public class UtilityClass<T extends BaseEntity> {

  ...bunch of stuff...

  List<T> values;

  public List<T> sort() {
    Collections.sort(values);
    return values;
  }

  ...more methods...
}

错误消息Bound mismatch: The generic method sort(List<T>) of type Collections is not applicable for the arguments (List<T>). The inferred type T is not a valid substitute for the bounded parameter <T extends Comparable<? super T>>
我认为问题是我正在尝试对BaseEntity对象列表进行排序,而BaseEntity本身未实现Comparable。但是现在我遇到了一个问题:使BaseEntity对象与其他BaseEntity对象可比的唯一明智的做法是,但是当我将implements Comparable<BaseEntity>添加到BaseEntity时,编译器告诉我我现在遇到了问题,因为我的Foo类试图同时实现这两个问题Comparable<BaseEntity>Comparable<Foo>,显然是不允许的。

我知道我可以通过删除implements Comparable<Foo>并仅实现Comparable<BaseEntity>来回避此问题,但是然后我的compareTo方法将不得不进行难看的强制转换,并且我认为使用泛型确实可以避免这种问题。

我真正想做的是在BaseEntity的签名中指定其所有子类均为Comparable,但仅适用于同一子类的实例。

非常感谢您提供的任何帮助。谢谢!

最佳答案

使用交叉点类型,如下所示:

public class MyList<T extends BaseEntity & Comparable<T>> {...}

这指定T本身必须同时是BaseEntity Comparable

09-28 11:38