递归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.htmlUPDATE
此外,看看你的代码,我看到另一辆自行车,有一个很好的库,谷歌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 super U>
如果你有更多的方法参数/返回值取决于
U
这将派上用场如果为函数声明两个参数怎么办?
public static
> void sortByValue(List list, final boolean ascending, final Function valueFunction) { ... final C v1 = ... final C v2 ... 没有理智用编译器检查自己(没有你的接口,我太饿了,不能嘲笑它们:)),但试一试。
我也太过于昏昏沉沉地无法判断它是否应该是
C extends Comparable
或C extends Comparable super C>
C extends Comparable super C>
。 我认为前者会起作用并且稍微有点普遍,尽管在实践中,大多数类都没有实现Comparable,除非他们自己。