如何为泛型方法编写简洁的闭包?

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 接受的答案说他不知道我的问题的解决方案问题。

还有一个很长的讨论,“函数式接口混乱”,未能回答这个问题。它不可能是“详细的匿名内部类在这里是最好的”,可以吗?

shm*_*sel 1

泛型 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)