पर कास्टिंग करते समय जावा में चेतावनी मेरे पास कुछ सामान्य कोड है जो मैं समझ नहीं सकता कि कानूनी रूप से चेतावनियां कैसे रोकें; मैं इस पल के लिए @SuppressWarnings ("अनचेक") का उपयोग कर रहा हूं, क्योंकि ऐसा लगता है कि एक सामान्य प्रकार कास्टिंग चेतावनी के बिना नहीं किया जा सकता है।जेनेरिक प्रकार
मैं एनोटेशन से कैसे छुटकारा पा सकता हूं?
क्या मेरे पास है:
public MyObject(SharedContext<Object> ctx) {
super(ctx); // set protected field 'context'
...
context.set("Input Fields" ,Collections.synchronizedMap(new TreeMap<String,Pair<String,Boolean>>(String.CASE_INSENSITIVE_ORDER)));
context.set("Output Fields" ,Collections.synchronizedMap(new TreeMap<String,String> (String.CASE_INSENSITIVE_ORDER)));
context.set("Event Registry",new EventRegistry(log) );
}
@SuppressWarnings("unchecked")
protected void startup() {
inputFields =(Map<String,Pair<String,Boolean>>)context.get("Input Fields" ,null);
outputFields =(Map<String,String> )context.get("Output Fields" ,null);
eventRegistry =(EventRegistry )context.get("Event Registry",null);
...
}
संरक्षित चर संदर्भ टाइप SharedContext<Object>
है।
...\MyClass.java:94: warning: [unchecked] unchecked cast
found : java.lang.Object
required: java.util.Map<java.lang.String,com.mycompany.Pair<java.lang.String,java.lang.Boolean>>
inputFields =(Map<String,Pair<String,Boolean>>)context.get("Input Fields" ,null);
^
...\MyClass.java:95: warning: [unchecked] unchecked cast
found : java.lang.Object
required: java.util.Map<java.lang.String,java.lang.String>
outputFields =(Map<String,String> )context.get("Output Fields" ,null);
व्यक्तिगत रूप से, मैं 'GenUtil.uncheckedCast' को एक विशिष्ट चेतावनी को दबाने से भी बदतर बुरा मानता हूं: इस बात की कोई गारंटी नहीं है कि इस उपयोगिता विधि को जिम्मेदारी से उपयोग किया जाता है, यानी एक तरह से जो ढेर प्रदूषण का कारण नहीं बनता है, लेकिन प्रोग्रामर को अब संकेत नहीं दिया जाता है एक और मजबूत कार्यान्वयन का प्रयास करने के लिए एक चेतावनी से। (जो कभी-कभी, हालांकि हमेशा नहीं, संभव है ...) – meriton
मैं असहमत हूं - कोई भी कलाकार संकलन को सूचित करते हुए संक्षेप में है "मुझे पता है कि इसका किस प्रकार है और आप नहीं करते हैं, इसलिए मेरे रास्ते से बाहर निकलें और मेरा इसके लिए शब्द "। इस परिस्थिति में उत्सर्जित चेतावनी सिर्फ वहां नहीं होनी चाहिए - ऐसा लगता है कि संकलक कह रहा है, "मुझे पता है कि मुझे नहीं पता, लेकिन मुझे विश्वास नहीं है कि आप भी ऐसा करते हैं"। –
कंपाइलर आपका शब्द नहीं लेता है, यह रनटाइम चेक उत्सर्जित करता है। एक कास्ट (और कभी-कभी) किसी ऑब्जेक्ट के प्रकार के बारे में दावा के रूप में उपयोग किया जा सकता है। चेतावनी आपको बताती है कि यह जांच अपूर्ण है और इसलिए इस पर भरोसा नहीं किया जा सकता है। – meriton