2015-12-22 7 views
18

मेरे पास एक अमूर्त वर्ग है जिसमें एक सार विधि है। मैं इसे तुरंत चालू करने के लिए लैम्ब्डा अभिव्यक्तियों का उपयोग कैसे कर सकता हूं। इसे एक इंटरफ़ेस में नहीं बनाया जा सकता है क्योंकि यह कक्षा को बढ़ाता है।सार कक्षाओं के लिए लैम्ब्डा अभिव्यक्ति

public class Concrete<T> { 
    // Has a bunch of predefined methods. 
} 


public abstract class Abstract<T> extends Concrete<T> { 
    public T getSomething(); 
    // Uses inherited methods from Concrete class 
} 

public class Driver { 
    public static void main(String[] args) { 
     System.out.println(new Abstract<String>() { 
      public String getSomething() { 
       // Returns something using inherited methods from Abstract    
       // Class and Concrete Class 
      } 
     }); 
    } 
} 
+2

स्थितियों के इन प्रकार में शामिल करने के लिए एक [MCVE] मददगार होगा (http://stackoverflow.com/help/mcve) जहाँ आप कुछ सुपर वर्ग है, अमूर्त वर्ग और एक इंस्टा ntiation कि आप एक lambda अभिव्यक्ति को कम करना चाहते हैं – luk2302

+0

कुछ कोड दिखाओ? – Jan

+0

आप getSomething() के लिए इंटरफ़ेस क्यों नहीं बना सकते हैं और क्या आपकी अमूर्त कक्षा कंक्रीट का विस्तार करती है और इंटरफ़ेस लागू करती है? – Jan

उत्तर

30

आप सीधे लैम्बडा अभिव्यक्ति को एक अमूर्त वर्ग को लक्षित नहीं कर सकते, क्योंकि स्लेमेन जेनीदी ने अपने जवाब में बताया।

public class AbstractLambda<T> extends Abstract<T> 
{ 
    private final Supplier<? extends T> supplier; 
    public AbstractLambda(Supplier<? extends T> supplier) 
    { 
     this.supplier = supplier; 
    } 

    @Override 
    public T getSomething() 
    { 
     return this.supplier.get(); 
    } 
} 

यह एक लैम्ब्डा अभिव्यक्ति के साथ इस्तेमाल किया जा सकता:

Abstract<String> a = new AbstractLambda<>(() -> "Hello World"); 
System.out.println(a.getSomething()); // prints 'Hello World' 

तुम भी गौर किया होगा कि यह कैसे java.lang.Thread वर्ग यह Runnables बाहर समर्थन करने के लिए करता है हालांकि, अगर आप एक समाधान लागू कर सकते हैं ऑफ-द-बॉक्स:

Thread t = new Thread(() -> System.out.println("Hello World")); 
t.start(); // eventually prints 'Hello World' 
+0

आपको बहुत बहुत धन्यवाद। मैंने यह कर दिया। यह पूरी तरह से काम करता है। – Halbort

+0

सरल और साफ :) –

+0

मैं इस बात से सहमत नहीं हूं कि थ्रेड को इसी तरह परिभाषित किया गया है। थ्रेड के लिए एक कन्स्ट्रक्टर तर्क के रूप में एक चलाने योग्य प्राकृतिक और चलने योग्य सरल FunctionalInterface है। यह इस कामकाज के समान नहीं दिखता है। – snap

18

नहीं है, आप इसे नहीं कर सकते। लैम्ब्डास को इंटरफेस पर एकल सार विधि को लक्षित करना होता है, और वे अमूर्त वर्गों पर एकल सार विधि के साथ काम नहीं करते हैं। यह कैसे है, और आपको इसे स्वीकार करना है,

हालांकि उन्हें यह समझ में आता है कि भाषा डिजाइनरों ने फैसला किया है कि यह जटिलता के लायक नहीं है जिसे सैम अमूर्त कक्षाओं पर लैम्ब्डा को अनुमति देकर पेश किया जाएगा।

As a reference, thats ब्रायन गोएट्ज़ ने सैम अमूर्त वर्ग पर लैम्ब्डा को अनुमति देने के बारे में क्या कहा।

मुख्य ब्रायन व्यक्ति के ईमेल से कुंजी अंक:

  • केवल लैम्ब्डा उम्मीदवार भीतरी वर्ग उदाहरणों अपने लक्ष्य

  • के लिए मॉडल के रूप में जटिल सार कक्षाएं था के 3% कुछ प्रतिशत उपयोग के मामले में एक बुरा व्यापार लग रहा था

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