जावा में प्रत्येक लूप के लिए जेनेरिक का उपयोग करते समय मुझे एक अजीब कंपाइलर त्रुटि मिली। क्या यह जावा कंपाइलर बग है, या क्या मैं वास्तव में यहां कुछ खो रहा हूं?जावा कंपाइलर कच्चे प्रकार के साथ foreach का उपयोग करने पर शिकायत क्यों करता है?
public class Generics<T extends Object> {
public Generics(T myObject){
// I didn't really need myObject
}
public List<String> getList(){
List<String> list = new ArrayList<String>();
list.add("w00t StackOverflow");
return list;
}
public static void main(String...a){
Generics generics = new Generics(new Object());
for(String s : generics.getList()){
System.out.println(s);
}
}
}
संकलक के साथ के लिए-प्रत्येक पंक्ति के बारे में शिकायत कर रहा है:
यहाँ मेरी पूरी कक्षा है। "प्रकार बेमेल तत्व प्रकार वस्तु से परिवर्तित नहीं कर सकते स्ट्रिंग के लिए"
मैं इस सूक्ष्म बदलाव करते हैं, यह संकलित:
public static void main(String...a){
Generics<?> generics = new Generics(new Object());
for(String s : generics.getList()){
System.out.println(s);
}
}
मैं जानता हूँ कि getList()
उपयोग जेनरिक करता है, लेकिन यह मैं क्या सोचा था पूरी तरह से असंबद्ध तरीका था में उन्हें उपयोग करता है। मैं इसे समझ सकता था अगर मैं किसी प्रकार के टी और getList()
पर पुन: प्रयास करने की कोशिश कर रहा था, तो List<T>
या कुछ लौटा, लेकिन यह मामला यहां नहीं है। getList()
का रिटर्न प्रकार टी के साथ बिल्कुल कुछ नहीं होना चाहिए और मुझे परवाह नहीं करना चाहिए कि मैं अपने जेनेरिक ऑब्जेक्ट के लिए कच्चे प्रकार का उपयोग करता हूं या नहीं ... सही? क्या ये पूरी तरह से असंबंधित नहीं होना चाहिए, या क्या मैं वास्तव में यहां कुछ खो रहा हूं?
ध्यान दें कि कोड भी संकलित अगर मैं इस, जो मैंने सोचा था कि करने के लिए पहले के रूप में अच्छी बराबर होना चाहिए कार्य करें:
public static void main(String...a){
Generics generics = new Generics(new Object());
List<String> list = generics.getList();
for(String s : list){
System.out.println(s);
}
}
क्या लगेगा है '<टी वस्तु फैली>' ' से अलग नहीं है'। आप अपने वर्ग का एक सामान्य संस्करण नहीं बना रहे हैं, आप कच्चे प्रकार का बना रहे हैं। जो हमें इस सवाल पर लाता है कि आपकी कक्षा सामान्य जगह क्यों है? टी का उपयोग करने वाली एकमात्र जगह निर्माता में है और आप उस संदर्भ का उपयोग नहीं करते हैं। –
unholysampler
मैंने '<टी ऑब्जेक्ट बढ़ाया>' का उपयोग किया क्योंकि मुझे बस एक उदाहरण के लिए कुछ चाहिए था। असली कोड स्पष्ट रूप से कुछ और है, और यह टी का उपयोग करता है ... यह सिर्फ 'getList() 'से पूरी तरह से असंबंधित तरीके से टी का उपयोग करता है। –
आपके प्रश्न से असंबद्ध है, लेकिन मैं निर्माता को जेनेरिक सीएलएस बना दूंगा) ताकि आपको इस जेनिक्स क्लास को बनाने के लिए टाइप टी के किसी ऑब्जेक्ट को तुरंत चालू करने की आवश्यकता न हो। –
MeBigFatGuy