我不知道为什么此代码无法编译:
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 ) );
}
}
所以我是在控制台上收到的:
..\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
我希望使用泛型为方法参数上的lambda包括类型。
答案 0 :(得分: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!") );
}
myMethod
接受带有通用参数的Function
,因此您不能总是使用apply
参数调用其String
方法并期望它返回{{1 }}。
相反,您可以将Long
参数传递给它,并将其返回类型更改为String
。
当然,此代码将抛出U
,因为您无法将NumberFormatException
转换为String
。
答案 1 :(得分:1)
正如Eran的答案所暗示的那样,您有两个问题:myMethod的定义和方法的调用。
1)您将methodParam声明为输入类型T和输出类型U的函数。然后在myMethod中,将其视为T为String且U为Long。这只是您要调用该方法的方式,但是此时编译器对T和U一无所知。当myMethod返回一个U类型的值(而不是Long)并接收一个T类型的参数而不是使用字符串调用apply()时,适用于myMethod的Erans解决方案可以工作。
2)在主方法中调用myMethod():如在Erans示例中那样,类型参数由您的参数隐式给出。否则,如果由于某些原因需要明确表示它们,则@ernest_k会显示解决方案(也可以找到here)。
答案 2 :(得分:1)
原因是Long.valueOf()
仅接受String
或long
。根据类型参数T
,编译器得出结论:Function
占用Object
,因为没有像Long.valueOf( Object )
这样的方法,所以它不允许这样做。
您可能需要将myMethod()
更改为此签名:
public static <T, U> Long myMethod( Function<String, Long> methodParam ) { //Both type parameters are explicit
return methodParam.apply("Today is happy day!");
}
或者这可能会引发NumberFormatException
:
public static <T, U> Long myMethod( Function<String, U> methodParam ){ //Input type parameter is explicit
return (Long) methodParam.apply( "Today is happy day!" );
}