无法将具有泛型方法的功能接口转换为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表达式。