java – 无法将泛型方法的功能接口转换为lambda表达式
发布时间:2020-12-15 04:21:48 所属栏目:Java 来源:网络整理
导读:无法将泛型方法的功能接口转换为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 voi
无法将泛型方法的功能接口转换为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表达式而不是匿名类. 这就是我得到的,一个错误. public void implement() { fun((Integer t) -> { }); } 它显示错误.这里使用的正确lambda表达式是什么? oneLambdaScopeTest.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表达式. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |