Java 8 lambda泛型接口方法

6
@FunctionalInterface
public interface GenericFunctionalInterface {
  public <T> T genericMethod();
}

我有一个上面的@FunctionalInterface并且它有一个泛型方法。

我该如何使用Lambda表达式来代表这个接口?

我尝试下面的代码,但它不起作用:

GenericFunctionalInterface gfi = () -> {return "sss";};

我得到了编译错误: 非法的 lambda 表达式:类型为 GenericFunctionalInterface 的方法 genericMethod 是泛型的。 我该在哪里放置类型信息?

请参考JLS8中的答案(https://dev59.com/bWEh5IYBdhLWcg3wTBxc#22588738)和第§15.27.3节(http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.27.3)。如果满足以下所有条件,则Lambda表达式与函数类型匹配:该函数类型没有类型参数。 - McDowell
你是指“通用”的方法吗?我没有看到与遗传学的任何联系。除此之外,这个方法应该怎么工作?方法<T> T geneticMethod()承诺返回调用者想要的任何东西,因此lambda表达式返回一个String并不能满足这一点。 - Holger
谢谢Holger。这是通用的。我想知道是否可以为lambda表达式设置类型信息。 - jack yin
1个回答

10
通用(不是遗传的)类型参数应该在接口级别中声明,而不是在方法级别中声明:
public interface GenericFunctionalInterface<T> {
  public T genericMethod();
}

GenericFunctionalInterface<String> gfi = () -> {return "sss";};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接