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

时间:2020-01-27 08:00:38

标签: 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 ) );
   }

}

所以我是在控制台上收到的:

..\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包括类型。

3 个答案:

答案 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()仅接受Stringlong。根据类型参数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!" );
}
相关问题