Lambda只能用于function界面?
我这样做了:
public class LambdaConflict { public static void main(String args[]){ //* System.out.println(LambdaConflict.get( (str) -> "Hello World!! By ME?" )); /*/ System.out.println(LambdaConflict.get(new Intf (){ @Override public String get1(String str){ return "Hello World!! By get1 " + str; } })); /*****/ } public static String get(Intf i, boolean b){ return i.get1("from 1"); } } interface Intf { public T get1(T arg1); public T get2(T arg1); }
并获得此exception:
不兼容的类型:Intf不是函数接口在接口Intf中找到的多个非重写抽象方法注意:某些消息已被简化; 使用-Xdiags:verbose重新编译以获得完整输出1错误
是否有任何条件我不能使用lambda来替换匿名类?
不,没有办法“克服”这个。 function接口必须只有一个抽象方法。 你的界面有两个:
interface Intf { public T get1(T arg1); public T get2(T arg1); }
注意:您不需要像注释中提到的那样注释您的界面。 但是,如果您的接口不是有效的function接口,则可以使用@FunctionalInterface
批注来获取编译时错误。 因此,它为您的代码带来了更多安全性。
有关详细信息,请参阅http://java.dzone.com/articles/introduction-functional-1
仅供参考,并丰富已经给出的答案:
根据JSR-335:用于Java编程语言的Lambda表达式 ,在Lambda规范,A部分:function接口部分中,它说:
function接口是一个只有一个抽象方法的接口(除了Object的方法),因此代表一个单一的函数契约。 (在某些情况下,这种“单一”方法可能采用多个抽象方法的forms,从超级接口inheritance的覆盖等效签名;在这种情况下,inheritance的方法在逻辑上代表单个方法。)
因此,您需要的是为您的某个方法提供默认实现,或者将您的某个方法放在不同的接口中。
想一想:
-
编译器应该如何知道是否要覆盖
get2
或get2
? -
如果你只重写
get1
,那么get2
的实现是什么? 即使您注释掉的代码也无效,因为您没有实现get2
…
有这个限制的原因……
正如@ Thomas-Uhrig所述,function接口只能有一种方法 。
一种解决这个问题的方法,主要是因为你从不使用public T get2(T arg1);
,是将Intf
接口更改为:
@FunctionalInterface interface Intf { public T get1(T arg1); }