[英]What's the difference between instance method reference types in Java 8?
因此 Java 8 引入了方法引用,並且文檔描述了這四種類型。
我的問題是這兩種實例類型有什么區別?
- 對特定對象的實例方法的引用。
- 對特定類型的任意對象的實例方法的引用。
兩者都引用了參考文獻,但有什么顯着不同? 是不是用於解決它們的類型推斷不同? (在他們的例子中)一個是閉包而另一個是 lambda 是否重要? 它與方法上的參數數量有關嗎?
myString::charAt
將接受一個int
並返回一個char
,並且可能用於任何以這種方式工作的 lambda。 它本質上轉換為index -> myString.charAt(index)
。
String::length
將接受一個String
並返回一個int
。 它本質上轉換為string -> string.length()
。
String::charAt
將轉換為(string, index) -> string.charAt(index)
。
有了這個,他們意味着你有以下幾點:
1) 例如可以是this::someFunction;
,這將返回當前對象的someFunction
引用。
2) 可以是例如String::toUpperCase
,這通常會返回String
的toUpperCase
方法。
我不確定行為是否存在實際差異,我認為就像您也可以對實例變量調用靜態方法一樣。
Oracle 描述了四種方法參考如下。
他們應該寫的是:
我發現他們對前兩個的描述令人困惑(“對靜態方法的引用”和“對特定對象的實例方法的引用”),我認為它確實是類 static和對象之間的區別。
我更願意將第一個視為提前已知的特定對象的實例方法,將第二個視為稍后將提供的任意對象的實例方法。 有趣的是,這意味着第一個是閉包,第二個是 lambda。 一個是綁定的,另一個是未綁定的。
關閉某物(閉包)和不關閉某物(lambda)的方法引用之間的區別可能有點學術性,但至少它是比 Oracle 無用的描述更正式的定義。 如果您對閉包和 lambda 之間的區別感興趣,請查看這篇文章。
兩種類型的實例方法引用之間的區別很有趣,但基本上是學術性的。 有時,您需要傳入一些東西,有時,lambda 的用法將為您提供。 我的抱怨是 Oracle 的文檔。 他們對這種區別有很大的了解,但未能以易於理解的方式對其進行描述。 這是規范的參考資料,但很容易讓人困惑。
我寫的還有一兩個微妙之處。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.