2015-09-16 3 views
8

करने के लिए एक स्थिर संदर्भ नहीं बना सकता
, क्यों विधि File::isHidden करने के लिए एक गैर स्थैतिक विधि-संदर्भ गुजर ठीक है
लेकिन एक गैर स्थैतिक विधि MyCass::mymethod को विधि संदर्भ गुजर - मुझे "गैर स्थैतिक विधि का स्थिर संदर्भ नहीं दे सकता"?विधि संदर्भ। किसी को मेरे लिए व्याख्या कर सकते हैं गैर स्थैतिक विधि

public static void main(String[] args) { 
    File[] files = new File("C:").listFiles(File::isHidden); // OK 
    test(MyCass::mymethod); // Cannot make a static reference to the non-static method 
} 

static interface FunctionalInterface{ 
    boolean function(String file); 
} 

class MyCass{ 
    boolean mymethod(String input){ 
     return true; 
    } 
} 

// HELPER 
public static void test(FunctionalInterface functionalInterface){} 

उत्तर

8

गैर स्थिर तरीकों की विधि संदर्भों पर संचालित करने के लिए एक उदाहरण की आवश्यकता है।

listFiles विधि के मामले में, तर्क FileFilteraccept(File file) के साथ है। आप एक उदाहरण (तर्क) पर संचालित रूप में, आप अपने उदाहरण तरीकों का उल्लेख कर सकते हैं:

listFiles(File::isHidden) 

जिसके लिए

listFiles(f -> f.isHidden()) 

अब तुम क्यों test(MyCass::mymethod) उपयोग नहीं कर सकते आशुलिपि है? क्योंकि आपके पास संचालित करने के लिए MyCass का उदाहरण नहीं है।

आप फिर भी एक उदाहरण बना सकते हैं, और फिर अपने उदाहरण विधि के लिए एक विधि संदर्भ पारित:,

MyCass myCass = new MyCass(); // the instance 
test(myCass::mymethod); // pass a non-static method reference 

या

test(new MyCass()::mymethod); 
+1

आप 'MyClass' को 'स्थिर' विधि (जैसे' main') से तत्काल नहीं कर सकते क्योंकि यह एक _non-static_ आंतरिक वर्ग है। आपको कक्षा को स्थैतिक घोषित करना होगा। मुझे लगता है कि मूल उदाहरण में कोड कक्षा के अंदर लपेटा गया है। –

1

पीटर-Walser के रूप में बताया के बाद से MyCass::mymethod एक उदाहरण विधि है इसे Function उदाहरण में परिवर्तित करने के लिए एक उदाहरण की आवश्यकता है।

static आपके इंटरफ़ेस घोषणा के सामने बस इसे स्थिर इंटरफ़ेस बनाता है, यह प्रत्येक विधि को स्थैतिक में नहीं बदलता है।

सम्भावित समाधान वर्ग के भीतर विधि के रूप में घोषित करने के लिए स्थिर होगा:

class MyCass{ 
    static boolean mymethod(String input){ 
     return true; 
    } 
} 

बेहतर यह कैसे काम करता समझने के लिए, आप विधि संदर्भ MyCass::mymethod है कि करने के लिए कोड equivalente (ऊपर मानते हुए विचार कर सकते हैं MyClass के संशोधित घोषणा):

0123:

new FunctionalInterface{ 
    boolean function(String file){ 
    return MyClass.mymethod(file); 
    } 
} 

आपका मूल कोड को सॉर्ट-के में अनुवाद करने का प्रयास

एक और संभावना BiFunction का उपयोग आपके FunctionalInterface के बजाय कर रही है। उस स्थिति में apply का पहला तर्क ऑब्जेक्ट होगा और दूसरा mymethod का तर्क होगा।

+1

आपका पहला उदाहरण 'MyClass.mymethod (फ़ाइल)' होना चाहिए। ओपी का कोड भी उसमें अनुवादित किया जाएगा।यही वह जगह है जहां "एक स्थिर संदर्भ नहीं बना सकता ..." त्रुटि आती है। आपके दूसरे उदाहरण में कोई स्थिर संदर्भ नहीं है। – zeroflagL

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