无法将具有泛型方法的功能接口转换为lambda表达式。
以下代码正在工作。它没有lambda表达式,即使用匿名类。

public interface Pro{
    public <T> void callee(T t);
}

public void fun(Pro obj){}


public void implement() {
    fun(new Pro() {
        @Override
        public <Integer> void callee(Integer t){}
    });
}

我不明白如何使用lambda表达式而不是匿名类。
我自己尝试后,使用了netbeans中显示的提示。我用图示的灯泡来做。

这就是我得到的一个错误。
public void implement() {
    fun((Integer t) -> {
    });
}

显示错误。这里要使用什么正确的lambda表达式?
这是错误:
one\LambdaScopeTest.java:18: error: incompatible types: invalid functional descriptor for lambda expression
    fun((Integer t) -> {
        ^
method <T>(T)void in interface Pro is generic
where T is a type-variable:
     T extends Object declared in method <T>callee(T)
Note: Some messages have been simplified; recompile with -Xdiags:verbose to get
full output

最佳答案

主要问题是您有通用方法而不是通用接口。那没有什么意义。一旦使接口成为通用接口,它就会起作用:

@FunctionalInterface
interface Pro<T> {
    void callee(T t);
}

public class Test {
    public static <T> void fun(Pro<T> obj){}

    public static void main(String[] args) {
        fun((Integer t) -> {});
    }
}

对于接口来说,通用是更有意义的,因为对于不同类型具有不同的实现才有意义。对于通用方法,建议每个实现都应能够接受任何类型的任何值,因为调用者将指定它-如果您随后使用具有特定类型的lambda表达式则没有意义。

您的原始版本仅能工作,因为您要声明一个称为Integer的通用类型参数...您未为Integer类型指定实现。换句话说,这是:
fun(new Pro() {
    @Override
    public <Integer> void callee(Integer t){}
});

等效于:
fun(new Pro() {
    @Override
    public <T> void callee(T t){}
});

...而且我不知道将其表示为lambda表达式的方式。基本上,我认为您的原始界面不适用于lambda表达式。

07-24 19:08
查看更多