【发布时间】:2014-07-04 03:17:27
【问题描述】:
我这样做了:
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<String> (){
@Override public String get1(String str){
return "Hello World!! By get1 " + str;
}
}));
/*****/
}
public static String get(Intf<String> i, boolean b){
return i.get1("from 1");
}
}
interface Intf<T>
{
public T get1(T arg1);
public T get2(T arg1);
}
并得到这个异常:
不兼容的类型:Intf 不是函数式接口 在接口 Intf 中找到多个非覆盖抽象方法 注意:一些消息已被简化;使用 -Xdiags:verbose 重新编译以获得 全输出 1 个错误
有什么情况不能用 lambda 代替匿名类吗?
【问题讨论】:
-
你说的克服是什么意思?你了解错误吗?
-
1) 功能接口必须只有一种方法。 2)它们必须被注释@FunctionalInterface
-
功能接口也称为SAM类型(单一抽象方法类型)。因此,您的函数式接口中只能有一个抽象方法。
-
@RichardTingle:我认为第 2 点无效。它们可以被注释,但不是必需的。
-
@RichardTingle:关于注释的要点。这不会使现有的接口(如
Runnable)失效吗?
标签: java lambda java-8 functional-interface