Tom*_*ine 5 java lambda generic-method generic-lambda
我想编写一个具有泛型方法的函数式非泛型接口的实现。实现需要是内联闭包并且简洁。
作为一个简化的例子
@FunctionalInterface interface Fn {
<R> R fn(R arg);
}
public class Scratch {
Fn id = arg -> arg;
//Fn nul = arg -> null;
//Fn requiresNonNull = ...
}
Run Code Online (Sandbox Code Playgroud)
这使
/Scratch.java:5: error: incompatible types: invalid functional descriptor for lambda expression
Fn id = arg -> arg;
^
method <R>(R)R in interface Fn is generic
where R is a type-variable:
R extends Object declared in method <R>fn(R)
1 error
Run Code Online (Sandbox Code Playgroud)
(实际上,参数将是一个通用接口,其方法的返回类型为R。)
有没有一种解决方法,而无需回到匿名内部类的冗长?
有一个明显类似的问题,“无法将带有泛型方法的函数接口转换为 lambda 表达式”,但这源于使用名为 的类型参数Integer而不是像 之类的传统T参数,而 Jon Skeet 接受的答案说他不知道我的问题的解决方案问题。
还有一个很长的讨论,“函数式接口混乱”,未能回答这个问题。它不可能是“详细的匿名内部类在这里是最好的”,可以吗?
泛型 lambda 不合法,但泛型方法引用合法。您可以通过创建辅助方法来减少匿名类的冗长:
public class Scratch {
Fn id = Scratch::id;
Fn nul = Scratch::nul;
Fn requiresNotNull = Objects::requireNonNull;
private static <R> R id(R arg) {
return arg;
}
private static <R> R nul(R arg) {
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
310 次 |
| 最近记录: |