afz*_*lex 3 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){}
});
}
Run Code Online (Sandbox Code Playgroud)
我无法理解如何使用lambda表达式而不是匿名类.
在自己尝试之后,我使用了netbeans中显示的提示.我使用所示的灯泡来做到这一点.

这就是我得到的,一个错误.
public void implement() {
fun((Integer t) -> {
});
}
Run Code Online (Sandbox Code Playgroud)
它显示错误.这里使用的正确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
Run Code Online (Sandbox Code Playgroud)
主要问题是你有一个通用方法而不是通用接口.这没有多大意义.只要您将界面设为通用,它就会起作用:
@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) -> {});
}
}
Run Code Online (Sandbox Code Playgroud)
接口是通用的更有意义,因为对不同类型的不同实现是有意义的.对于通用方法,建议每个实现都应该能够接受任何类型的任何值,因为调用者将指定它 - 如果您随后使用具有特定类型的lambda表达式则没有意义.
您的原始版本仅起作用,因为您声明了一个名为的泛型类型参数Integer...您没有为该Integer类型指定实现.换句话说,这个:
fun(new Pro() {
@Override
public <Integer> void callee(Integer t){}
});
Run Code Online (Sandbox Code Playgroud)
相当于:
fun(new Pro() {
@Override
public <T> void callee(T t){}
});
Run Code Online (Sandbox Code Playgroud)
...我不知道代表的一种方式是作为一个lambda表达式.基本上,我认为你的原始界面不适合lambda表达式.
| 归档时间: |
|
| 查看次数: |
2390 次 |
| 最近记录: |