Lambda只能用于功能界面吗?

Val*_*len 12 java lambda java-8 functional-interface

我这样做了:

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);
}
Run Code Online (Sandbox Code Playgroud)

并获得此异常:

不兼容的类型:Intf不是函数接口在接口Intf中找到的多个非重写抽象方法注意:某些消息已被简化; 使用-Xdiags重新编译:详细以获得完整输出1错误

是否有任何条件我不能使用lambda来替换匿名类?

Tho*_*rig 20

不,没有办法"克服"这一点.功能接口必须只有一个抽象方法.你的界面有两个:

interface Intf<T> {
    public T get1(T arg1);
    public T get2(T arg1);
}
Run Code Online (Sandbox Code Playgroud)

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

有关详细信息,请参阅http://java.dzone.com/articles/introduction-functional-1


Edw*_*rzo 7

仅供参考,并丰富已经给出的答案:

根据JSR-335:用于Java编程语言的Lambda表达式,在Lambda规范,A部分:功能接口部分中,它说:

功能接口是一个只有一个抽象方法(除了Object的方法)的接口,因此代表一个函数契约.(在某些情况下,这种"单一"方法可能采用多个抽象方法的形式,从超级接口继承的覆盖等效签名;在这种情况下,继承的方法在逻辑上代表单个方法.)

因此,您需要的是为您的某个方法提供默认实现,或者将您的某个方法放在不同的接口中.