2013-02-27 215 views
12

ठीक है तो मैं एक हस्ताक्षर (Class<? extends Throwable>... exceptions) के साथ एक विधि फोन कर रहा हूँ और मैं एक मुख्य विधि में यहाँ चेतावनी "File.java अनियंत्रित या असुरक्षित संचालन का उपयोग करता है" मिल:varargs क्यों है (कक्षा <? फेंकने योग्य> ... टी) "अनचेक या असुरक्षित" ऑपरेशन?

public class VarargsFun { 
    public void onException(Class<? extends Throwable>... exceptions) { } 

    public static void main(String[] args) { 
     new VarargsFun().onException(IllegalArgumentException.class); 
    } 
} 

संकलक करने में सक्षम नहीं होना चाहिए देखें कि IllegalArgumentException वास्तव में RuntimeException, Exception और Throwable का विस्तार करता है?

इस चेतावनी से छुटकारा पाने के लिए मुझे अपने कोड को सही तरीके से संशोधित करना चाहिए?

मैं वास्तव में मेरे अपवाद instantiating की तरह नहीं लग रहा है ... इसका इस्तेमाल करने के अच्छे लगता .class

जावा का उपयोग कर रहा हूँ 7. कोई सुझाव के लिए धन्यवाद (न तो @SuppressWarnings उपयोग करना चाहते हैं!) ।

+0

क्या आप सुनिश्चित हैं कि चेतावनी 'तब थ्रो' से आ रही है और 'कब' नहीं? 'MockQuery' घोषित कैसे किया जाता है? क्या यह एक सामान्य वर्ग का मजाक है? –

+0

ठीक है मैंने कोड को एक टेस्टेबल उदाहरण में बदल दिया है। – vikingsteve

उत्तर

11

क्योंकि varargs वास्तव में केवल सरणी हैं, और generics and arrays don't mix (अच्छी तरह से), जावा ने परंपरागत रूप से एक चेतावनी दी है जब आप एक सामान्य vararg प्रकार के साथ एक विधि को कॉल करते हैं। ऐसा इसलिए है क्योंकि कॉलर पर सरणी तकनीकी रूप से बनाई जा रही है।

हालांकि, यह जल्द ही स्पष्ट हो गया कि निर्माण अकेले एक varargs विधि को पास करने की सरणियों फोन करने वाले का नजरिए से सामान्य सामान्य सरणियों के रूप में ही खतरे से ग्रस्त नहीं था, हालांकि विधि ही है कि जेनेरिक सरणी प्राप्त दुरुपयोग कर सकता है उन्हें। तो जावा 7 आगे में, चेतावनी (आपके मामले में, onException) विधि पर ही दिखाई देता है और पद्धति पर @SafeVarargs एनोटेशन का उपयोग करके दबा दिया जा सकता है:

@SafeVarargs 
public void onException(Class<? extends Throwable>... exceptions) { } 

आप जावा का उपयोग कर वास्तव में नहीं कर रहे हैं 7 भाषा, या यदि आप onException नहीं बदल सकते हैं (शायद क्योंकि यह एक पुस्तकालय विधि है) तो आप सुरक्षित रूप से @SuppressWarnings कि चेतावनी को छिपाने के लिए उपयोग कर सकते हैं:

@SuppressWarnings("unchecked") 
public static void main(String[] args) { 
    new VarargsFun().onException(IllegalArgumentException.class); 
} 

आप फिर भी इस तरह से चेतावनी को दबाने के हैं, को अलग करने के ख्याल रखना यह एक कथन अपनी पद्धति में है ताकि आप गलती से ओटी दबा सकें उसकी भविष्य की चेतावनियां।

व्यक्तिगत रूप से, मैं सामान्य रूप से अपने आईडीई में जेनेरिक vararg चेतावनियों को अक्षम करता हूं, क्योंकि वे कॉलर के दृष्टिकोण से लगभग गलत कोड कभी नहीं इंगित करते हैं।

+0

अंतिम अनुच्छेद सहित फिर से अपना उत्तर पढ़ें। धन्यवाद! – vikingsteve

+0

यह भी अजीब है कि मुझे इससे सोनार चेतावनियां भी नहीं मिलती हैं। किसी भी मामले में, मैंने विधि पर '@SuppressWarnings (" अनचेक ") जोड़ा। फिर से Thx। – vikingsteve

11

यदि आप महसूस करते हैं कि

new VarargsFun().onException(IllegalArgumentException.class); 

new VarargsFun().onException(
    new Class<? extends Throwable>[]{ IllegalArgumentException.class }); 

के लिए बस वाक्यात्मक चीनी है समझने के लिए सबसे आसान है अर्थात कॉल साइट varargs के प्रकार के बराबर घटक प्रकार के साथ एक सरणी पैदा करता है।

लेकिन निश्चित रूप से, new Class<? extends Throwable>[] जावा में अनुमति नहीं है। तो संकलक new Class<?>[] करता है और चेतावनी देता है।

+0

धन्यवाद newacct! मैंने मार्क के जवाब को पहले ही स्वीकार कर लिया है, लेकिन आपका जोड़ने के लिए भी धन्यवाद। – vikingsteve