具有函数式接口参数类型的 Java 泛型方法

mar*_*tan 0 java generics lambda

我不明白为什么这段代码不能编译:

package Desktop;

import java.util.function.*;

public class MyClass {

    public static <T, U> Long myMethod( Function<T, U> methodParam ) {
      return methodParam.apply("Today is happy day!");
    }

   public static void main(String[] args) {
      System.out.println( <String, Long>myMethod( Long::valueOf ) );
   }

}
Run Code Online (Sandbox Code Playgroud)

所以我在控制台上收到了这个:

..\Desktop\MyClass.java:15: error: illegal start of expression
          System.out.println( <String, Long>myMethod( Long::valueOf ) );
                                            ^
..\Desktop\MyClass.java:15: error: ';' expected
          System.out.println( <String, Long>myMethod( Long::valueOf ) );
                                                                     ^
2 errors
Run Code Online (Sandbox Code Playgroud)

我期望使用泛型在方法参数上包含 lambda 的类型。

Era*_*ran 5

它应该是:

public static <T, U> U myMethod(Function<T, U> methodParam, T t) {
  return methodParam.apply(t);
}

public static void main(String[] args) {
   System.out.println(myMethod(Long::valueOf, "Today is happy day!") );
}
Run Code Online (Sandbox Code Playgroud)

myMethod接受Function带有泛型参数的 a ,因此您不能总是apply使用String参数调用其方法并期望它返回 a Long

相反,您可以将String参数传递给它,并将其返回类型更改为U.

当然,这段代码会抛出 a NumberFormatException,因为你不能将它转换String为 a Long