2014-10-02 16 views
10

यह क्यों काम नहीं करता है? मुझे कंपाइलर त्रुटि मिलती है "गैर स्थैतिक विधि प्रिंट के लिए स्थिर संदर्भ नहीं बना सकता ..."जावा 8 गैर-स्थैतिक विधि के लिए विधि संदर्भ

public class Chapter3 { 
    public void print(String s) { 
     System.out.println(s); 
    } 
    public static void main(String[] args) { 
     Arrays.asList("a", "b", "c").forEach(Chapter3::print); 
    } 
} 

उत्तर

3

मुझे लगता है कि मुझे अब मिल गया है। इसलिए मैं एक स्ट्रिंग intance पर प्रिंट कॉल नहीं कर सकते क्या स्ट्रीम में है प्रकार स्ट्रिंग की है ...

उदाहरण के लिए इस काम करता है

public class Chapter3 { 
final String value; 

public Chapter3(String value) { 
    this.value = value; 
} 

public void print() { 
    System.out.println(value); 
} 

public static void main(String[] args) { 
    Arrays.asList(new Chapter3("a"), new Chapter3("b")).forEach(Chapter3::print); 
} 
} 
7

forEach स्वीकार करता है एक Consumer<? super T> (उसके हस्ताक्षर default void forEach(Consumer<? super T> action) है) है, जो है एक विधि accept(T t) के साथ एक कार्यात्मक इंटरफेस जिसमें एक भी तर्क है।

जब आप किसी तर्क के किसी गैर-स्थैतिक विधि संदर्भ को पास करते हैं, तो आपके पास वास्तव में दो तर्क होते हैं - thisChapter3 उदाहरण और स्ट्रिंग तर्क के संदर्भ में। यह forEach अपेक्षाओं से मेल नहीं खाता है।

10

चाहे आप विधि संदर्भ, लैम्ब्डा अभिव्यक्तियों या सामान्य विधि कॉल का उपयोग करते हों, भले ही एक आवृत्ति विधि को आमंत्रण के लिए एक उचित उदाहरण की आवश्यकता हो। उदाहरण समारोह आमंत्रण द्वारा प्रदान किया जा सकता है, उदा। अगर forEach की उम्मीद है BiConsumer<Chapter3,String> यह काम किया। लेकिन चूंकि forEach आपके मामले में Consumer<String> की अपेक्षा करता है, तो Chapter3 का कोई उदाहरण नहीं है। आप या तो द्वारा आसानी से इसे ठीक कर सकते हैं, एक static विधि करने के लिए या विधि मंगलाचरण के लिए लक्ष्य के रूप में एक उदाहरण प्रदान करके Chapter3.print बदल रहा:

public class Chapter3 { 
    public void print(String s) { 
     System.out.println(s); 
    } 
    public static void main(String[] args) { 
     Arrays.asList("a", "b", "c").forEach(new Chapter3()::print); 
    } 
} 

यहाँ, new Chapter3(), Chapter3 का एक नया उदाहरण का परिणाम है, के लिए लिया जाएगा विधि print विधि और Consumer<String> उस विधि पर विधि का आविष्कार करने का तरीका बनाया जा सकता है।

+0

एक पंक्ति का जवाब यह है: दायरे में अध्याय 3 का कोई उदाहरण नहीं है ..... धन्यवाद आपने मेरे संदेहों को मंजूरी दे दी है। –

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