在Java的功能接口中键入安全性

时间:2017-11-09 19:09:12

标签: java generics java-8

我已经达到了处理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类中并在此方法中使用它们。

3 个答案:

答案 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); }

这样的输入