Lambda只能与功能接口一起使用吗?


问题内容

我这样做:

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替换匿名类?


问题答案:

否。没有办法“克服”这一问题。功能接口必须只有一种抽象方法。您的界面有两个:

interface Intf<T> {
    public T get1(T arg1);
    public T get2(T arg1);
}

注意:您不需要注释中提到的界面注释。但是,@FunctionalInterface如果您的接口不是有效的功能接口,则可以使用注释获得编译时错误。因此,它为您的代码带来了更多安全性。

有关更多信息,请参见例如http://java.dzone.com/articles/introduction-
functional-1