2015-08-27 17 views
7

Neden aşağıdakiler çalışmıyor?Java 8 Belirli bir türdeki rastgele bir nesnenin örnek yöntemine yöntem başvurusu

import java.util.function.Function; 

public class MethodRefTest { 
    public String passMeAround(String input) { 
     return input + " been passed to me"; 
    } 

    public Function<String, String> testReferences() { 
     final Function<String, String> f1 = MethodRefTest::passMeAround; 
     return f1; 
    } 

    public static void main(String[] args) { 
     new MethodRefTest() 
      .testReferences() 
      .apply("foo"); 
    } 
} 

Javac söylüyor: Bağlam statik neden

MethodRefTest.java:14: error: invalid method reference 
     final Function<String, String> f1 = MethodRefTest::passMeAround; 
             ^
    non-static method passMeAround(String) cannot be referenced from a static context 
1 error 

Ben anlamıyorum. this'u okudum, ancak eldeki problemi cevaplamıyor gibi görünüyor.

DÜZENLEME

da oracle göre, "özel bir tip rasgele bir nesnenin bir örnek yöntemi referans" ContainingType::methodName

DÜZENLEME 2

marko-Topolnik @ yardımcı ile mümkündür Benim hatamı burada anlıyorum. Function<String, String> f1 = MethodRefTest::passMeAround; bu uygulama madde geçirilen, any instance örneği yönteme değinmektedir, statik bir yöntem ise String MethodRefTest.passMeAround(String)

BiFunction<MethodRefTest, String, String> f1 = MethodRefTest::passMeAround; 

belirtmektedir.

BiFunction<MethodRefTest, String, String> f2 = MethodRefTest::passMeAround; 
//call instance method 
f2.apply(new MethodRefTest(), "some string"); 
+3

@ AlexandroSifuentesDíaz saatini öğrenmek için Java 8. Şu anda oldukça uzun bir süredir. –

+2

hatalı hata mesajı. – ZhongYu

+1

Ama @ BrianGoetz, 'class :: method' (ve OP'nin durumunda _does_) bir örnek yöntem referansına gider. Hata iletisi yanıltıcıdır, çünkü asıl sorun hedef tipi ile örnek yöntem referansının türü arasındaki uyumsuzluktur. –

cevap

14

Eğer sen bağlam için kullanmak örneğini veren

this::passMeAround 

olarak anılacaktır gerekirdi

MethodRefTest::passMeAround 

olarak bahseder çünkü.

Geçerli kodunuzu görmenin farklı bir yolu, MethodRefTest::passMeAround'un BiFunction<MethodRefTest, String, String> olduğunu ve bu lambda şeklinin hedef site ile eşleşmediğini söylemektir. Yani, alternatif olarak,

public BiFunction<MethodRefTest, String, String> testReferences() { 
    return MethodRefTest::passMeAround; 
} 

yazmış olabilir ve ana yönteme

final MethodRefTest t = new MethodRefTest(); 
t.testReferences().apply(t, "foo"); 

malzeme içinde yeterince öğretici, bana genişletmek izin vermeyebilir okuma.

this::passMeAround 

ile oluşturulduğu bağlamdan this örneği yakalamıştır bir lambda nesnesi olsun, ama

MethodRefTest::passMeAround 

ile bir "saf" olmayan yakalama lambda olsun hangi Belirtilen yöntemin örneğinde bazı dize argümanı ile çağrılmasını temsil eder, böylece apply her ikisini de girmeniz gerekir.Statik için

+0

Bu https://blog.idrsolutions.com/2015/02/java-8-method-references-explained-5-minutes/ örneğini takip ediyordum. – dabai

+0

http://www.studytrails.com/java/java8/Java8_Lambdas_FunctionalProgramming.jsp – cxw

0

Değişim passMeAround:

public static String passMeAround(String input) { 
     return input + " been passed to me"; 
    } 

veya örnek yöntemine olarak bakın:

public Function<String, String> testReferences() { 
     final Function<String, String> f1 = this::passMeAround; 
     return f1; 
} 
+2

"PassMeAround'u Statik'e dönüştür" ifadesinin "Metot Referansları" bölümünde daha fazla açıklama bulunmaktadır. "MethodRefTest :: passMeAround" 'çalışmıyor? (https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html 'ContainingType :: methodName' ifadesine göre," belirli bir türdeki rasgele bir nesnenin * örnek yöntemi * referansı " – Pshemo

-1

bağlam statik neden sorunuza gelince, bu kadar :: önceki kısım çünkü sınıfı yerine bir örneği adının adıydı. Bir örneğiniz yoksa, yalnızca statik üyelere erişilebilir.

+1

Ancak "MethodRefTest :: passMeAround" bir örnek yöntemini ifade etmesine rağmen bir yasal yöntem referansıdır. OP'nin kullandığı yerde uygun değil. Yöntem referansı bir üye erişim ifadesi değildir. –

İlgili konular