Java泛型:类似函数的max()

Igo*_*nko 7 java generics

功能抽象:

  public abstract class Function<X, Y> {     
      abstract Y apply(X x);      
  }
Run Code Online (Sandbox Code Playgroud)

max 方法实现

public static <V extends Comparable<V>> Function<List<V>, V> max() {

    return new Function<List<V>, V>() {
        @Override
        public V apply(List<V> list) {
            return Collections.max(list);
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

和用法(它应该是什么样子)

Date result = max().apply(datesList);
Run Code Online (Sandbox Code Playgroud)

但我得到这个错误,不明白它为什么需要 Object

incompatible types; inferred type argument(s) java.lang.Object do not conform to bounds of type variable(s) V
found   : <V>project.Function<java.util.List<V>,V>
required: java.lang.Object
Run Code Online (Sandbox Code Playgroud)

我已经阅读了大量类似的质量保证,但没有得到如何解决这个问题.谢谢.

Jes*_*per 13

Java的类型推断非常有限.如果你这样写:

Date result = max().apply(datesList);
Run Code Online (Sandbox Code Playgroud)

这是不够成熟的推断的类型参数max()的方法,V,所以需要java.lang.Object代替.你可以试试这个:

Function<List<Date>, Date> fn = max();
Date result = fn.apply(dates);
Run Code Online (Sandbox Code Playgroud)

或者,如果要将其写在一行中,则可以执行以下操作,假设您的max()方法是在名为的类中定义的Example:

Date result = Example.<Date>max().apply(dates);
Run Code Online (Sandbox Code Playgroud)