有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java函数接口中的泛型类型安全

我已经达到了处理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) 个答案

  1. # 1 楼答案

    我认为如果你接受你自己的答案是可以的,但我想指出的是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. # 2 楼答案

    修正了它:

    private <T extends Comparable<T>> Comparable<T> applyFunctionOnStuff(
            final Collection<T> stuff,
            final Function<Collection<T>, T> function) {
        return function.apply(stuff);
    }
    

    这似乎神奇地接受了applyFunctionOnStuff(new ArrayList<Integer>(), Collections::max);这样的输入

  3. # 3 楼答案

    代码中有一点冗余,因为类型T被定义为T extends Comparable<T>,然后每次引用类型T时,您都会按如下方式使用:Comparable<T>实际上应该是T本身

    因此,您的代码应该如下所示:

    private <T extends Comparable<T>> T applyFunctionOnStuff(
        final Collection<T> stuff,
        final Function<Collection<T>, T> function) {
        return function.apply(stuff);
    }
    

    然后您可以使用Collections::max而不会出现任何进一步的错误