मैं एंड्रॉइड स्टूडियो 1.1.0 का उपयोग कर रहा हूं।अनचेक असाइनमेंट चेतावनी
public static class A {
public Map<Integer, String> getMap() {
return null;
}
}
public static class B {
public void processA(A a) {
Map<Integer, String> map = a.getMap();
}
}
लेकिन बनाने A
सामान्य:
public static class A<T> {
public Map<Integer, String> getMap() {
return null;
}
}
और इस लाइन:
यह कोई चेतावनी का कारण बनता है
Map<Integer, String> map = a.getMap();
अब आप एक चेतावनी हो जाता है: "Unchecked assignment: 'java.util.Map to java.util.Map<java.lang.Integer, java.lang.String>'
।
भले ही getMap
का हस्ताक्षर T
से पूरी तरह से स्वतंत्र है, और कोड Map
के प्रकारों के बारे में स्पष्ट नहीं है।
मुझे पता है कि मैं processA
reimplementing इस प्रकार से चेतावनी से छुटकारा पाने के कर सकते हैं:
public <T> void processA(A<T> a) {
Map<Integer, String> map = a.getMap();
}
लेकिन मैं ऐसा करने के लिए होगा? T
क्या मायने रखता है?
तो, सवाल है - क्यों विलोपन टाइप करता है न केवल T
को प्रभावित करने के लिए है (जो समझा जा सकता है - अगर मैं A
का एक उदाहरण गुजर रहा हूँ, T
एक अज्ञात है), लेकिन यह भी "हार्डकोडेड" <Integer, String>
की तरह सामान्य हस्ताक्षर इस मामले में?
के प्रकार की जरूरत है , लेकिन हे कंपाइलर इस तथ्य को नहीं जानता है - ठीक है, यह * इसे आसानी से जान सकता है, बस 'प्रक्रिया ए' के कार्यान्वयन पर नज़र डालें, यह सत्यापित करना मुश्किल नहीं है कि 'टी' अप्रासंगिक है;) जैसा कि आप सुझाव देते हैं, मैं '> 'के साथ जाऊंगा, लेकिन मैं कंपाइलर से निराश हूं। –
@ कोनराडमोराव्स्की एक आदर्श दुनिया में, केवल 'ए' अवैध होना चाहिए और कोड संकलित नहीं होना चाहिए। लेकिन पिछड़े संगतता कारणों के लिए इसकी अनुमति है। 'ए' के रूप में घोषित कक्षा के लिए, इसका सामान्य प्रकार 'ए' से संबंधित कुछ भी करने के लिए बेहद महत्वपूर्ण है। तो बस 'ए' का उपयोग करने की अनुमति नहीं दी जानी चाहिए (वास्तव में स्कैला में, केवल 'ए'' का उपयोग करना अवैध है) –
Jatin
हाँ, मुझे कल्पना है ... मैं स्कैला का उपयोग नहीं करता, लेकिन मैं सी # पक्ष से आया हूं दुनिया और जावा के जेनेरिक जूते पहनने की तरह लगता है। –