Java 8 features hakkında bir şeyler okuyordum ve yöntem referanslarına sahip olduklarını gördüm, ancak yöntem aşırı yüklendiğinde hangi yöntemin nasıl belirtileceğini görmedim. Kimse biliyor mu?Boş olmayan bağımsız değişkenler için yöntem başvuruları?
cevap
:
lambda ifadeleri kullanılabilir? hedef türü uygun parametresinin türü olduğu
yöntem ya da yapıcı argümanlar. Yöntem veya yapıcı aşırı yüklendiyse, olağan aşırı yükleme mekanizmaları, lambda ifadesinin hedef türle eşleşmesinden önce kullanılır. (Aşırı yük çözünürlüğünden sonra, , aynı imzası ile aynı işlevsel arayüzleri aynı işlevsel tanımlayıcılarla kabul eden birden fazla eşleştirme yöntemi veya kurucu olabilir. Bu durumda, lambda ifadesi, bu işlevsel arabirimlerden birinin türüne döküm olmalıdır.) ; Hedef türünü açıkça sağlayan cast ifadeleri.
Örneğin:
Object o =() -> { System.out.println("hi"); }; // Illegal: could be Runnable or Callable (amongst others)
Object o = (Runnable)() -> { System.out.println("hi"); }; // Legal because disambiguated
Yani, belirsiz imzalar varsa bunu döküm gerekir.
Derleyici, yöntem imzasını fonksiyonel arabirim ile eşleştirecektir.
Integer foo(){...}
Integer foo(Number x){...}
Supplier<Number> f1 = this::foo; //()->Number, matching the 1st foo
Function<Integer, Number> f2 = this::foo; // Int->Number, matching the 2nd foo
Esasen, f2
bir Integer
kabul edip bir Number
dönebilirsiniz şeydir, derleyici 2 foo()
gereksinimi karşıladığını öğrenebilirsiniz. this Lambda FAQ itibaren
Fonksiyonel arayüzler için lambda ifadeleri kısaltmalar olduğundan, yöntemin türü arayüzdeki yöntemden kötüye kullanılabilir olmalıdır. –
@ LeonardBrünings: Bu lambda ifadelerine değil, farklı olan yöntem referanslarına işaret ediyor. Bir lambda ifadesi, bir fonksiyonun bir uygulamasıdır; Bir yöntem referansı, önceden varolan bir sınıftan önceden varolan bir yönteme yapılan bir referanstır. –
@LouisWasserman Bağlandığım makaleye göre, yöntem referansları lambda olarak benim etiketim olarak uygulanacak. – ArtB