public interface ANIMAL {
void cry();
public static void main(String [] args){
ANIMAL cat = () -> System.out.println("貓: 喵喵叫");
Object o = cat; //true
// Object o1 = () -> System.out.println("貓: 喵喵叫"); //報錯
}
}
代碼如上
看《java核心技術卷1》的時候,說無法直接把lambda運算式直接賦值給Object物件,我也測驗了,確實不行。
但是為什么用Main cat = () -> System.out.println("貓: 喵喵叫"); 后,就可以了呢?難道Main cat = () -> System.out.println("貓: 喵喵叫");這行代碼可以把lambda運算式自動生成一個cat物件?
我也翻看了一下位元組碼:
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=1, locals=3, args_size=1
0: invokedynamic #1, 0 // InvokeDynamic #0:cry:()Lcom/company/Main;
5: astore_1
6: aload_1
7: astore_2
8: return
LineNumberTable:
line 7: 0
line 8: 6
line 10: 8
我也沒看到有相關生成物件的指令啊,我查了一下invokedynamic指令也和生成物件沒什么關系,
這個我就有點疑惑了,書上也說得,不要把lambda運算式看作物件,要看作一個代碼塊,那為什么還會出現這個情況
uj5u.com熱心網友回復:
自頂!不能沉!!!uj5u.com熱心網友回復:
對想都沒實體化你怎么賦值?
//實體化一個Animal介面
Animal cat=()->System.out.println("貓:喵喵叫");
//把實體化的Animal介面型別cat賦值給Object型別
Object o=cat;
Main cat = () -> System.out.println("貓: 喵喵叫"); 可以通過編譯?除非你有Main這個介面型別,不然是通不過的。
好好看看程式有沒有匯入Main。
uj5u.com熱心網友回復:
ANIMAL cat 啊 哪有Main cat
uj5u.com熱心網友回復:
這個我就有點疑惑了,書上也說得,不要把lambda運算式看作物件,要看作一個代碼塊,那為什么還會出現這個情況
對想都沒實體化你怎么賦值?
//實體化一個Animal介面
Animal cat=()->System.out.println("貓:喵喵叫");
//把實體化的Animal介面型別cat賦值給Object型別
Object o=cat;
Main cat = () -> System.out.println("貓: 喵喵叫"); 可以通過編譯?除非你有Main這個介面型別,不然是通不過的。
好好看看程式有沒有匯入Main。
這個我就有點疑惑了,書上也說得,不要把lambda運算式看作物件,要看作一個代碼塊,那為什么還會出現這個情況
對想都沒實體化你怎么賦值?
//實體化一個Animal介面
Animal cat=()->System.out.println("貓:喵喵叫");
//把實體化的Animal介面型別cat賦值給Object型別
Object o=cat;
Main cat = () -> System.out.println("貓: 喵喵叫"); 可以通過編譯?除非你有Main這個介面型別,不然是通不過的。
好好看看程式有沒有匯入Main。
我又整理了一下我的疑惑
其實我的疑惑就是lambda運算式不是一個物件,那么還如何執行賦值給一個介面實體參考:
Animal cat = ()->System.out.println("貓:喵喵叫");
難道lambda運算式可以自動轉換成介面實體?
在我嘗試:Object o1 = () -> System.out.println("貓: 喵喵叫");這段代碼執行的時候,給出的提示是:
Error:(9, 21) java: 不兼容的型別: java.lang.Object 不是函式介面
我的理解就是: () -> System.out.println("貓: 喵喵叫") 就是一個函式介面
那么意思就是lambda運算式可以直接轉換成介面實體么?
這個轉換怎么做到的。。
uj5u.com熱心網友回復:
我又整理了一下我的疑惑
其實我的疑惑就是lambda運算式不是一個物件,那么還如何執行賦值給一個介面實體參考:
Animal cat = ()->System.out.println("貓:喵喵叫");
難道lambda運算式可以自動轉換成介面實體?
在我嘗試:Object o1 = () -> System.out.println("貓: 喵喵叫");這段代碼執行的時候,給出的提示是:
Error:(9, 21) java: 不兼容的型別: java.lang.Object 不是函式介面
我的理解就是: () -> System.out.println("貓: 喵喵叫") 就是一個函式介面
那么意思就是lambda運算式可以直接轉換成介面實體么?
這個轉換怎么做到的。。
()代表方法 ->代表如何實作該方法,實際上等于重新寫該方法的。
uj5u.com熱心網友回復:
lambda 運算式是一個用來實作介面的方式,這個介面里必須只含有一個抽象方法。你在用lambda 運算式之前需要先知道什么是functional interface, 需要知道lambda的由來
uj5u.com熱心網友回復:
lambda 運算式是一個用來實作介面的方式,這個介面里必須只含有一個抽象方法。
你在用lambda 運算式之前需要先知道什么是functional interface, 需要知道lambda的由來
是實作了一個介面,那用lambda實作了這個介面以后,為什么可以直接賦值給介面實體?
Animal cat = ()->System.out.println("貓:喵喵叫");
還是這個例子, 《()->System.out.println("貓:喵喵叫")》就代表的是一個物件?還是說賦值給cat的時候自動生成了一個Animal介面的實體?
uj5u.com熱心網友回復:
我又整理了一下我的疑惑
其實我的疑惑就是lambda運算式不是一個物件,那么還如何執行賦值給一個介面實體參考:
Animal cat = ()->System.out.println("貓:喵喵叫");
難道lambda運算式可以自動轉換成介面實體?
在我嘗試:Object o1 = () -> System.out.println("貓: 喵喵叫");這段代碼執行的時候,給出的提示是:
Error:(9, 21) java: 不兼容的型別: java.lang.Object 不是函式介面
我的理解就是: () -> System.out.println("貓: 喵喵叫") 就是一個函式介面
那么意思就是lambda運算式可以直接轉換成介面實體么?
這個轉換怎么做到的。。
()代表方法 ->代表如何實作該方法,實際上等于重新寫該方法的。
那這個重寫的方法能直接賦值給Animal的介面實體啊?
uj5u.com熱心網友回復:
那這個重寫的方法能直接賦值給Animal的介面實體啊?
lambda運算式需要函式式介面的支持
函式式介面:介面中只有一個抽象方法的介面(這樣才知道要動態替換哪個方法)
你的介面符合函式式介面,所以可以替換該方法,相當于實體化介面,好好看看lambda的說明吧。
uj5u.com熱心網友回復:
我又整理了一下我的疑惑
其實我的疑惑就是lambda運算式不是一個物件,那么還如何執行賦值給一個介面實體參考:
Animal cat = ()->System.out.println("貓:喵喵叫");
難道lambda運算式可以自動轉換成介面實體?
在我嘗試:Object o1 = () -> System.out.println("貓: 喵喵叫");這段代碼執行的時候,給出的提示是:
Error:(9, 21) java: 不兼容的型別: java.lang.Object 不是函式介面
我的理解就是: () -> System.out.println("貓: 喵喵叫") 就是一個函式介面
那么意思就是lambda運算式可以直接轉換成介面實體么?
這個轉換怎么做到的。。
()代表方法 ->代表如何實作該方法,實際上等于重新寫該方法的。
那這個重寫的方法能直接賦值給Animal的介面實體啊?
我部了解Animal 介面的結構,那我就先假設你里面有一個print 方法, 這個lamda 運算式會被編譯器翻譯成下面的樣子
Animal cat = new Animal() {
@Override
print(){
System.out.println("喵");
}
};
uj5u.com熱心網友回復:
Animal cat = ()->System.out.println("貓:喵喵叫");有相當于一個匿名類繼承了Animal介面 , 你重寫了介面中的方法,cat為該匿名類的實體,然后你想上轉型為Animal型別。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/103196.html
標籤:Java相關
上一篇:制作表單
