递归generics

有没有办法使这种方法适当通用并取消警告?

/** * 

Sort a collection by a certain "value" in its entries. This value is retrieved using * the given valueFunction which takes an entry as argument and returns * its value.

* *

Example:

*
// sort tiles by number *Collects.sortByValue(tileList, true, new Function() { * public Integer call(NormalTile t) { * return t.getNumber(); * } *});

* * @param list The collection. * @param ascending Whether to sort ascending (true) or descending (false). * @param valueFunction The function that retrieves the value of an entry. */ public static void sortByValue(List list, final boolean ascending, @SuppressWarnings("rawtypes") final Function valueFunction) { Collections.sort(list, new Comparator() { @SuppressWarnings({ "unchecked", "rawtypes" }) @Override public int compare(T o1, T o2) { final Comparable v1 = valueFunction.call(o1); final Comparable v2 = valueFunction.call(o2); return v1.compareTo(v2) * (ascending ? 1 : -1); } }); }

我试过Function<? extends Comparable, T> Function<? extends Comparable, T>Function<? extends Comparable, T> Function<? extends Comparable, T> Function<? extends Comparable, T>但是既没有编译,也没有调用compareTo的错误。 前者是:

Comparable类型中的compareTo(捕获#9-of?)方法不适用于参数(捕获#10-of?extends Comparable)

尝试这个:

 public static > void sortByValue(List list, final boolean ascending, final Function valueFunction) { Collections.sort(list, new Comparator() { @Override public int compare(T o1, T o2) { final C v1 = valueFunction.apply(o1); final C v2 = valueFunction.apply(o2); return v1.compareTo(v2) * (ascending ? 1 : -1); } }); } 

你还需要super来允许为子类型定义比较器。 更多解释: http : //docs.oracle.com/javase/tutorial/extra/generics/morefun.html

UPDATE

此外,看看你的代码,我看到另一辆自行车,有一个很好的库,谷歌collections,提供非常方便的订购概念来处理它。

所以,你的代码看起来像:

 Ordering myOrdering = Ordering.natural() .onResultOf(new Function() { public Integer call(NormalTile t) { return t.getNumber(); })) .nullsLast(); ... Collections.sort(list, myOrdering); //or newList = myOrdering.sortedCopy(readonlyList); 

这对我有用(Eclipse编译器)

 public static > void sortByValue( List list, final boolean ascending, final Function valueFunction) { Collections.sort(list, new Comparator() { @Override public int compare(T o1, T o2) { final U v1 = valueFunction.call(o1); final U v2 = valueFunction.call(o2); return v1.compareTo(v2) * (ascending ? 1 : -1); } }); } 

正如其他人发布的那样,你甚至可以更进一步宣布U

 U extends Comparable 

如果你有更多的方法参数/返回值取决于U这将派上用场

如果为函数声明两个参数怎么办?

 public static > void sortByValue(List list, final boolean ascending, final Function valueFunction) { ... final C v1 = ... final C v2 ... 

没有理智用编译器检查自己(没有你的接口,我太饿了,不能嘲笑它们:)),但试一试。

我也太过于昏昏沉沉地无法判断它是否应该是C extends ComparableC extends Comparable C extends Comparable 。 我认为前者会起作用并且稍微有点普遍,尽管在实践中,大多数类都没有实现Comparable,除非他们自己。