2014-06-24 9 views
7

के साथ कार्यात्मक इंटरफ़ेस के रूप में मैं बस नई जावा सुविधाओं के बारे में सीख रहा हूं। और यहां मेरा प्रश्न है:कॉल करने योग्य <Void> लैम्बडास

लैम्बडा अभिव्यक्तियों के लिए कार्यात्मक इंटरफ़ेस के रूप में Callable<Void> का उपयोग करने की अनुमति क्यों नहीं है? (कंपेलर वापसी मूल्य के बारे में शिकायत करता है) और यह अभी भी Callable<Integer> का उपयोग करने के लिए पूरी तरह से कानूनी है। यहां नमूना कोड है:

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(); 
    } 
} 

इस व्यवहार को कैसे समझाया जाए?

+1

यदि आपके पास वापसी मूल्य नहीं है तो आप यहां 'रननेबल' का उपयोग नहीं कर पाएंगे? (मैं अभी तक जावा 8 से परिचित नहीं हूं) – Thilo

+0

@ थिलो: कॉलबल का उपयोग करने का एक लाभ यह है कि यह एक भविष्य लौटाता है, जिसका उपयोग बाद में अन्य उद्देश्यों के लिए किया जा सकता है, जैसे कि एक रन को मारना बहुत लंबा होता है। – devdanke

+0

इसके अलावा कॉल करने योग्य अनचेक अपवाद फेंक सकता है जबकि रननेबल – Greg

उत्तर

20

Void विधि (void विधि से अलग) के लिए, आपको null वापस करना होगा।

Void केवल एक प्लेसहोल्डर है जिसमें कहा गया है कि आपके पास वास्तव में वापसी मूल्य नहीं है (भले ही निर्माण - जैसे कॉल करने योग्य - एक की आवश्यकता है)। कंपाइलर इसका किसी भी विशेष तरीके से इलाज नहीं करता है, इसलिए आपको अभी भी एक "सामान्य" रिटर्न स्टेटमेंट रखना होगा।

+0

नहीं देख सकता http://docs.oracle.com/javase/8/docs/api/java/lang/Void.html – Keppil

+0

स्मार्ट देखें। मैंने सोचा कि यह सिर्फ यह नहीं समझ सका कि इसे किस कॉल करना चाहिए और स्थिर कार्यों को कॉल करने योग्य के लिए पैरामीटर प्रदान करने के लिए सामान्य होना चाहिए, लेकिन मुझे नहीं लगता है। आप हर दिन कुछ नया सीखते हैं। – EpicPandaForce

+0

हाँ, अच्छा। 'वापसी शून्य' ठीक काम करता है, लेकिन सरल 'वापसी' कथन नहीं करता है, और मैं समझ नहीं पा रहा हूं क्यों। – ferrerverck

संबंधित मुद्दे