无法将泛型方法的功能接口转换为lambda表达式

时间:2014-08-11 14:15:51

标签: java generics lambda

无法将泛型方法的功能接口转换为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中显示的提示。我使用了显示的灯泡来做到这一点。

enter image description here

这就是我得到的,一个错误。

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

1 个答案:

答案 0 :(得分:8)

主要问题是您已获得通用方法而非通用接口。这并没有多大意义。只要您将界面设为通用,它就会起作用:

@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的通用类型参数...您指定{{1}的实现}类型。换句话说,这个:

Integer

相当于:

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

...而且我不知道将 表示为lambda表达式的方法。基本上,我认为你的原始界面不适合lambda表达式。