2015-02-04 58 views
-1

在編程難題&代碼高爾夫有this與此代碼元問題:作爲java函數文本的lambda表達式是如何工作的?

interface I { 
    public static void main(String[] args) { 
    System.out.println("Hello"); 
    } 
    String foo(String s); 
    } 
class C { 
    I i = s -> s.substring(1); 
} 

這是一個可運行的程序。我一直在玩ideone中的代碼,並能夠創造各種各樣的錯誤,但這對我來說是最奇怪的。

如果你喜歡的東西5取代s.substring(1)你得到這個錯誤:

Main.java:16: error: incompatible types: bad return type in lambda expression 
I i = s -> 5;//s.substring(1); 
     ^
int cannot be converted to String 

這是爲什麼?畢竟,我沒有看到lambda完全實現接口。

+2

你有擡頭的錯誤消息的任何部分:_'I'不是**功能界面** _ –

+0

'類C'創建使用Lambda,你只能做I'的'的實現?爲一個功能界面。當你刪除了唯一的非靜態函數'foo'的定義時,界面'I'不再是一個功能接口 – Alex

回答

3

只能將lambda表達式分配給功能接口。功能接口必須有一個抽象方法。

foo是您的I接口的單一抽象方法,因此在刪除它之後,不能將lambda表達式分配給類型爲I的變量。

此外,foo具有與lambda表達式s -> s.substring(1)匹配的簽名和返回類型 - 單個String參數和String返回類型。

至於你的編輯 - I i = s -> 5;是錯誤的,因爲lambda表達式必須實現I接口,所以不能返回int,因爲Ifoo方法返回一個String

+0

OKAY。很明顯,功能接口錯誤是我的疏忽。我看着它,並認爲'字符串foo(double a);'是在公共靜態空白部分。無論如何,我更關心爲什麼修改lambda表達式會導致錯誤。例如,如果將's.substring(1)'更改爲'5',那麼'int不能轉換爲String'。那是怎麼回事? – Luminous

+1

@發光你的'I'接口的'foo'方法有一個字符串返回類型,所以lambda表達式必須返回一個字符串,而不是一個int,以便分配給一個類型爲'I'的變量。 – Eran

+0

爲什麼'foo'會關心lambda?畢竟,你並沒有完全實現這個接口。順便說一句,我正在改變我的問題,因爲我的功能界面錯誤甚至不涉及我想要的東西。 – Luminous

0

在Java中8 Lambda表達式依賴於代表一個功能接口。這些被稱爲「功能接口」。他們被認爲有一個單一的抽象方法。

如果有多個,爪哇不能告訴一個由lambda表達式給出的implementationg應該imlement。

和當然,如果有沒有 - Java可以,不是因爲它不存在實現它。

相關問題