के मेरे पास है लगता है निम्नलिखित हैं:मुझे सामान्य कॉल को स्पष्ट रूप से क्यों डालने की आवश्यकता है?
public <T extends Widget> List<T> first(T n) {
return first(n.getClass());
}
public <T extends Widget> List<T> first(Class<T> n) {
return new ArrayList<>();
}
संकलक "incompatible types; required: java.util.List<T>; found: java.util.List<capture#1 of ? extends my.app.Widget>
" के साथ लाइन 3 पर शिकायत। जो मुझे समझ में नहीं आता क्यों। यह मेरे लिए उचित लगता है कि प्रकार T
उप-प्रकार के अलावा किसी अन्य मामले में कभी भी नहीं बदला जा सकता है।
इसे स्पष्ट कास्टिंग के माध्यम से तय किया जा सकता है, हालांकि मुझे नहीं पता कि इसकी आवश्यकता क्यों है।
public <T extends Widget> List<T> first(T n) {
return (List<T>)first(n.getClass());
}
public <T extends Widget> List<T> first(Class<T> n) {
return new ArrayList<>();
}
क्या यह एक कंपाइलर बग हो सकता है?
नोट मैं JDK 1.7.0_15 उपयोग कर रहा हूँ:
java version "1.7.0_15"
Java(TM) SE Runtime Environment (build 1.7.0_15-b03)
Java HotSpot(TM) 64-Bit Server VM (build 23.7-b01, mixed mode)
मैंने आपके उत्तर को कुछ बार पढ़ा और सोचा कि मुझे समझ में आया, लेकिन अब मुझे पूरा यकीन नहीं है। मान लीजिए 'सर्कल' और 'स्क्वायर' 'विजेट' के उप-वर्ग हैं। अगर मैं 'प्रथम (Circle.class)' कहता हूं, तो यह केवल 'सूची <के लिए संभव है? सर्किल> 'वापस आने के लिए, यानी मैं नई ArrayList' वापस नहीं कर सकता क्योंकि संकलक मुझे अनुमति नहीं देगा। –
'Circle.class' एक संकलन समय निरंतर है, यह * नया सर्किल()। GetClass()' जैसा नहीं है जिसे रनटाइम तक हल नहीं किया गया है। यदि आपने 'पहला (Circle.class)' कहा है, तो यह 'ठीक' वापस ठीक कर सकता है, लेकिन यदि आप वास्तविक प्रकार को खोजने के लिए रन टाइम तक प्रतीक्षा नहीं करते हैं। –
Affe
मेरे भ्रम में जोड़कर मुझे आश्चर्य हुआ कि मैं 'सूची y = पहले (n.getClass()) भी नहीं कर सकता; हालांकि, निश्चित रूप से वापस लौटाई गई सूची केवल वही हो सकती है, जैसा आपने कहा था? विजेट को बढ़ाता है, जहां तक मैं समझता हूं कि इस परिणामी सूची में केवल 'विजेट' या वंशज शामिल हो सकते हैं? –