SORU
25 Mart 2015, ÇARŞAMBA


Neden bu Java 8 lambda derlemek için başarısız mı?

Aşağıdaki Java kodunu derlemek için başarısız:

@FunctionalInterface
private interface BiConsumer<A, B> {
    void accept(A a, B b);
}

private static void takeBiConsumer(BiConsumer<String, String> bc) { }

public static void main(String[] args) {
    takeBiConsumer((String s1, String s2) -> new String("hi")); // OK
    takeBiConsumer((String s1, String s2) -> "hi"); // Error
}

Derleyici bildirildi

Error:(31, 58) java: incompatible types: bad return type in lambda expression
    java.lang.String cannot be converted to void

Tuhaf olan şey şu satırı "iyi derler, ama hat" Hata "başarısız olur. işaretli" OK işaretli. Aslında aynı görünüyor.

CEVAP
25 Mart 2015, ÇARŞAMBA


Senin lambda BiConsumer<String, String> ile uyumlu olması gerekir. Eğer JLS #15.27.3 (Type of a Lambda) başvurursanız:

Lambda ifadesi ise aşağıdakilerin tümü doğruysa, bir işlev türü ile uyumlu

  • [...]
  • Eğer fonksiyon türü sonuç geçersizdir, lambda vücudun her iki ifade bir ifade (§14,8'ken) veya void uyumlu bir bloktur.

Lambda deyimi ifade veya geçersiz uyumlu bir blok ya gerekir:

  • Yapıcı bir çağırma derler yani a statement expression.
  • Açıklama edebi bir ifade değil, bir dize ve geçersizdir uyumlu değil (cf. Derleme değil 7**).

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ASUS

    ASUS

    22 EKİM 2005
  • Fr. Eckle Studios

    Fr. Eckle St

    29 Kasım 2006
  • MrOctopi

    MrOctopi

    6 Aralık 2010