9

我有一组类都有一些共同的属性,所以我让它们都扩展了一个共同的基类,BaseEntity. 所以我有,例如Foo extends BaseEntityBar extends BaseEntity

我还希望这些FooBar对象的列表是可排序的,所以我实现了Comparable. 我将类定义为Foo extends BaseEntity implements Comparable<Foo>and ,并且s 或sBar extends BaseEntity implements Comparable<Bar>列表的排序按预期工作 - 当然,排序的细节在不同的子类中是不同的。但是当我事先不知道我是否会有s 或s时,我无法弄清楚如何使我的排序工作。例如,此代码无法编译:FooBarFooBar

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>and Comparable<Foo>,这显然是不允许。

我知道我可以通过放弃implements Comparable<Foo>和只是实现来回避这个问题Comparable<BaseEntity>,但是我的compareTo方法将不得不进行丑陋的转换,我认为这正是使用泛型应该避免的那种问题。

我真正想做的是在签名中指定它的BaseEntity所有子类都将是Comparable,但仅限于同一子类的实例。

感激地接受任何帮助。谢谢!

4

4 回答 4

8

使用交集类型,如下所示:

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

这指定 T 必须既是 aBaseEntity Comparable是自身。

于 2013-01-29T07:49:50.923 回答
2

不使用Collections.sort(List<T>)Collections.sort(Lst<T>, Comparator<? extends T>)改为使用。在比较器中写入比较代码。

于 2013-01-29T07:58:02.320 回答
1

试试这个:

static <T extends Comparable<? super T>> sort(T[] array);

这是完成任务的最通用规范。基本上,它断言 T 是一种可以与自身进行比较的类型。

于 2013-01-29T07:47:12.173 回答
0

你可以制作一个超级简单的排序方法,可以处理几乎任何 List 类型

public class Tools {

    public static <E> void sortList(List<E> list, Comparator<E> comparator) {
        Collections.sort(list, comparator); 
    }

    // Any other utility methods/resources you want in here

}

这意味着只要给定的 List 和 Comparator 的类型相同,就可以调用此方法对任何 List 进行排序。即使没有您拥有的基类(BaseEntity),它也可以工作

于 2019-07-23T12:16:35.763 回答