2014-06-24 15 views
7

Sadece yeni java8 özelliklerini öğreniyorum. Ve benim sorum:Callable <Void> lambdas İşlevsel Arabirim olarak

Neden lambda ifadeleri için işlevsel bir arabirim olarak Callable<Void> kullanmak için izin verilmiyor? (Derleyici değer döndürme hakkında şikayet ediyor) Ve hala orada Callable<Integer> kullanmak için tamamen yasal.

public class Test { 
    public static void main(String[] args) throws Exception { 
     // works fine 
     testInt(() -> { 
      System.out.println("From testInt method"); 
      return 1; 
     }); 

     testVoid(() -> { 
      System.out.println("From testVoid method"); 
      // error! can't return void? 
     }); 
    } 

    public static void testInt(Callable<Integer> callable) throws Exception { 
     callable.call(); 
    } 

    public static void testVoid(Callable<Void> callable) throws Exception { 
     callable.call(); 
    } 
} 

Nasıl bu davranışı açıklamak için: İşte örnek kod?

+1

Dönüş değeri yoksa bunun yerine 'Runnable' kullanamazdınız mı? (Henüz Java8 ile aşina değilim) – Thilo

+0

@Thilo: Callable'ı kullanmanın bir yararı, bir işi çok uzun süre öldürmek gibi, daha sonra başka amaçlar için kullanılabilecek bir Gelecek getirmesidir. – devdanke

+0

Ayrıca Runbleable olamazken Callable denetlenmeyen bir istisna atabilir – Greg

cevap

20

Void yöntemi için (void yönteminden farklı olarak), null ürününü döndürmeniz gerekir.

Void, aslında bir dönüş değerine sahip olmadığınızı belirten bir yer tutucudur (yapılışı - Callable gibi - buna ihtiyaç duyar). Derleyici herhangi bir özel muamelede bulunmaz, bu yüzden hala "normal" bir iade beyannamesi koymanız gerekir.

+0

Bkz. Http://docs.oracle.com/javase/8/docs/api/java/lang/Void.html – Keppil

+0

Smart. Sadece hangisini çağırması gerektiğine karar veremedim ve Callable parametresini sağlamak için statik işlevler genel olmalıydı, ama sanırım değil. Her gün yeni bir şeyler öğreniyorsun. – EpicPandaForce

+0

Evet, güzel. 'return null' iyi çalışıyor, ancak basit 'return' ifadesi yok ve nedenini anlayamıyorum. – ferrerverck