我已经达到了处理Java类型系统的能力极限。场景是这样的:
我需要一个可以采用Collection<Comparable>
的方法和一个以Collection<Comparable>
作为输入并从该集合中返回单个元素的函数。
这似乎是这样做的:
private <T extends Comparable<T>> Comparable<T> applyFunctionOnStuff(
final Collection<Comparable<T>> stuff,
final Function<Collection<Comparable<T>>, Comparable<T>> function) {
return function.apply(stuff);
}
但是我无法将Collections::max
弯曲为该函数的有效输入。我想知道是否有办法将这样的静态方法包装到Function
类中并在此方法中使用它们。
答案 0 :(得分:5)
您的代码中有一些冗余,因为类型T
定义为T extends Comparable<T>
,然后每当您引用类型T
时,您都会按如下方式使用它:{{1实际上应该只是Comparable<T>
本身。
所以你的代码应该是这样的:
T
然后您可以使用private <T extends Comparable<T>> T applyFunctionOnStuff(
final Collection<T> stuff,
final Function<Collection<T>, T> function) {
return function.apply(stuff);
}
而不会出现任何其他错误
答案 1 :(得分:2)
我认为如果您接受自己的答案就没问题,但我想指出Comparable
通常必须声明为Comparable<? super T>
,否则您最终会遇到泛型类型的怪异。您的返回类型应为T,而不是Comparable<T>
。
我还没有看到你正在做的事情比直接调用有问题的函数更容易。您的方法似乎对代码进行了超出必要的混淆。
public class FunctionalComparable {
public static void main( String[] args ) {
Collection<String> names = new ArrayList<>( Arrays.asList(
"Larry", "Moe", "Curly" ) );
// why not just this?
System.out.println( Collections.max( names ) );
// this seems more work than necessary
System.out.println( doIt( names, Collections::max ) );
}
private static <T extends Comparable<? super T>> T doIt(
final Collection<T> collection,
final Function<Collection<T>, T> function )
{
return function.apply( collection );
}
}
答案 2 :(得分:-3)
修正了它:
<tr *ngFor="let result of results">
<ng-container *ngFor="let col of searchResultColumnNames">
<td *ngIf="col !== refId" >
{{ result[col] }}
</td>
</ng-container>
</tr>
这似乎神奇地采取了像private <T extends Comparable<T>> Comparable<T> applyFunctionOnStuff(
final Collection<T> stuff,
final Function<Collection<T>, T> function) {
return function.apply(stuff);
}