स्थैतिक सामान्य विधियों को कॉल करना


106

मैं स्थैतिक सामान्य विधियों को शामिल करते हुए एक जिज्ञासु स्थिति में आया हूं। यह कोड है:

class Foo<E>
{
    public static <E> Foo<E> createFoo()
    {
        // ...
    }
}

class Bar<E>
{
    private Foo<E> member;

    public Bar()
    {
        member = Foo.createFoo();
    }
}

अभिव्यक्ति में किसी भी प्रकार के तर्क को कैसे निर्दिष्ट नहीं करना है Foo.createFoo()? क्या यह किसी प्रकार का अनुमान है? यदि मैं इसके बारे में स्पष्ट होना चाहता हूं, तो मैं प्रकार तर्क कैसे निर्दिष्ट कर सकता हूं?


7
मैं आपको CreateFoo विधि के प्रकार पैरामीटर E को बदलने की सलाह दूंगा। क्योंकि, क्लास फू के प्रकार पैरामीटर E, विधि createFoo () के प्रकार पैरामीटर E से भिन्न है।
गुरसेल कोका

@GurselKoca वह स्पष्ट रूप से सदस्य = Foo कर सकता है। <E> createFoo (); उन्हें संकलन समय के समान होने की आवश्यकता है।
जॉर्ज जेवियर

जवाबों:


183

हां, यह JLS खंड 15.12.2.8 के अनुसार, असाइनमेंट के लक्ष्य के आधार पर प्रकार का निष्कर्ष है । स्पष्ट होने के लिए, आप कुछ इस तरह कॉल करेंगे:

Foo.<String>createFoo();

3
या, जैसा कि मेरे मामले में: Foo.<E>createFoo();धन्यवाद :)
fredoverflow

7
यह कैसे काम के बिना भी काम करता है? यानी, बयान Foo.createFoo(); सिर्फ ठीक संकलन करता है ...? क्या यह प्रकार के क्षरण के कारण है?
fredoverflow

9
@FredOverflow बिना असाइनमेंट Eके "अनुमान" हैObject
irreputable

2
नई लिंक स्थान शायद होगा: docs.oracle.com/javase/specs/jls/se8/html/...
Joanis

3
के प्रकार को निर्दिष्ट करने का एक अलग तरीका Eहोगा प्रकार के createFoo()एक तर्क को परिभाषित करना Class<E>(इसलिए यह होगा createFoo(Class<E> type)), और इसके साथ कॉल करेंcreateFoo(String.class)
गेविन एस। Yancey
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.