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

  • John Lynn

    John Lynn

    8 Ocak 2010
  • njhaley

    njhaley

    24 NİSAN 2006
  • Rayone GB

    Rayone GB

    14 Temmuz 2007