簡體   English   中英

Java 功能接口和 Lambda 表達式

[英]Java Functional Interfaces and Lambda Expressions

鑒於以下代碼,有人可以解釋為什么斷言返回 true 嗎? 盡管進行了無數次搜索,但我無法得到任何適當的答案來解釋為什么會出現這種情況,以及 Java 功能導致這種行為的原因以及我在類似地創建這樣的接口時會有哪些限制/要求像這樣。

interface X {
  default int foo() {return 1;}
  String bar();
}

public class Exercise{
  public static void main(String[]arg){
    X foo1=()->"hello";
    assert (foo1.bar()).equals("hello");
  }
}

lambda 表達式是一種創建功能接口實例的簡潔方法,該接口是具有一個抽象方法的接口。 這里, X是一個函數式接口,帶有抽象方法bar() 您可以通過以下方式實現 X:

class XImpl implements X { 
    public String bar() { return "Foo"; }
}

X instance = new XImpl();

或匿名 class

X anon = new X() { 
    public String bar() { return "foo"; }
};

或 lambda

X lambda = () -> "foo";

這些中的每一個都實例化了X的實現。 可能讓您感到困惑的是 lambda 的簡潔性; 因為X只有一個抽象方法bar ,所以您不必說您正在實現bar ——編譯器會計算出來。 由於bar()不采用 arguments 並返回String ,因此編譯器確保 lambda 的形狀與唯一抽象方法的形狀兼容。

因為X有一個bar()方法,所以您可以在以下每個實例上調用它:

String s1 = instance.bar();
assertEquals(s1, "hello");

String s2 = anon.bar();
assertEquals(s2, "hello");

String s3 = lambda.bar();
assertEquals(s3, "hello");

你會得到相同的結果。

由於方法foo()具有默認實現,因此您只需要指定bar() - 您可以使用X foo1 = ()->"hello"來執行此操作。

所以,你的foo1.bar()返回你好。

UPD:我的回答可能不清楚,所以我應該注意編譯器不會將“foo”視為抽象方法(這讓您的接口X滿足聲明功能接口的要求)。 布賴恩在他的回答中解釋得更清楚、更詳細。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM