Javaがメソッド参照に。ではなく::を使用するのはなぜですか?


7

なぜJavaでは::なくメソッド参照にJavaを使用するの.か、たとえば、なぜ

  System.out::println

の代わりに

  System.out.println

もちろん、単に「デザイナーが決定したため」と答えることもできます。一方、ドットはクラスメンバーにアクセスするための通常のJava構文であるため、2番目の構文を期待していました。

メソッド参照に::既存の.規則を使用する代わりに、新しい構文を導入する既知の特別な理由はありますか?

回答:


20

これは、クラスにメソッドと同じ名前の(静的)メンバーがある場合にあいまいさを回避するためです(Javaではそれを許可しています)。

メソッド参照に関するJavaチュートリアルのコードスニペットから簡単に確認できます

このラムダ式は既存のメソッドを呼び出すため、ラムダ式の代わりにメソッド参照を使用できます。

Arrays.sort(rosterAsArray, Person::compareByAge);

Person上記のスニペットのクラスにcompareByAge(に渡すのに適切なタイプの)という名前のメンバーもある場合Arrays.sort、ドット表記では、パラメーターがメソッドまたはメンバーを参照しているかどうかを判別できません。


2
回答に感謝し、私の無知を許してください:メンバー変数とメソッドが同じ名前を持つことが許可されていることを知りませんでした。+1
Giorgio

3

動作が同じでないため、新しい構文が導入されました。

.あなたがするために、機能上の参照を取得したいということを意味起動直後にそれを。

メソッド参照(::)を使用する場合、関数への参照を保存したい、すぐに呼び出したくない場合。

より実用的な側面は、パブリック属性と同じ名前のメソッドをどのように区別するの.ですか?できません。と::曖昧さはありません。


「。は、関数を呼び出すことを意味し、文字通りコードを実行します。」いいえ、ドットはメンバーへのアクセスを意味します。括弧は、Cスタイルの構文(Javaなど)を持つ言語で関数を呼び出すことを意味します。
Miles Rout、2016年

1
@MilesRout確かに私の答えは混乱を招くので、自分の考えをより明確にするために編集しました。
2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.