2012-01-31 11 views
6

नमस्कार सभी,हमें @SuppressWarnings ("अनचेक") के लिए मध्यस्थ चर का उपयोग क्यों करना है?

मैं सोच रहा था क्या कारण है कि

public class test<T> { 
    T[] backing_array; 

    public void a(int initial_capacity) { 
     @SuppressWarnings("unchecked") 
     T[] backing_array = (T[]) new Object[initial_capacity]; 
     this.backing_array = backing_array; 
    } 
} 

मान्य है, लेकिन

public class test<T> { 
    T[] backing_array; 

    public void b(int initial_capacity) { 
     @SuppressWarnings("unchecked") 
     this.backing_array = (T[]) new Object[initial_capacity]; 
    } 
} 

एक वाक्य रचना/संकलक त्रुटि है है?

क्या कारण है कि हमें @SuppressWarnings("unchecked") के लिए मध्यस्थ चर का उपयोग करना है?

+0

mmm..same यहां पर क्लिक करें, लेकिन यदि आपने कक्षा ब्लॉक से पहले SuppressWarning को स्थानांतरित किया है, तो यह ठीक है .. इसके लिए +1। – Jasonw

+0

@ जेसनव, http://docs.oracle.com/javase/7/docs/api/java/lang/SuppressWarnings.html से: _ "शैली के मामले में, प्रोग्रामर को हमेशा इस गहराई से घोंसले पर इस एनोटेशन का उपयोग करना चाहिए तत्व जहां यह प्रभावी है। यदि आप किसी विशेष विधि में चेतावनी को दबाना चाहते हैं, तो आपको अपनी कक्षा के बजाय उस विधि को एनोटेट करना चाहिए। "_ –

उत्तर

5

@SuppressWarnings("unchecked") इसके बाद घोषणा और असाइनमेंट के दायरे पर लागू होता है। इसे फ़ंक्शंस के दायरे, या विशिष्ट चर के असाइनमेंट को असाइन किया जा सकता है।
आपके पहले उदाहरण में, यह स्थानीय चर पर लागू होता है। दूसरे उदाहरण में, आप इसे उस फ़ील्ड के असाइनमेंट पर लागू करने का प्रयास कर रहे हैं जिसे पहले ही घोषित किया गया था।

देखें कि यह संकलन नहीं करता है:

public class Test<T> { 

    public void a(int initial_capacity) { 
     T[] backing_array; 
     @SuppressWarnings("unchecked") 
     backing_array = (T[]) new Object[initial_capacity]; 
    } 
} 

और इस चेतावनी पर कोई प्रभाव नहीं:

public class Test<T> { 

    public void a(int initial_capacity) { 
     @SuppressWarnings("unchecked") 
     T[] backing_array; 
     backing_array = (T[]) new Object[initial_capacity]; 
    } 
} 

संक्षेप में, SuppressWarnings पर एक चर के इसके दायरे में लागू नहीं किया जा सकता है। यह विधि पर लागू होने पर एक असाइनमेंट + गिरावट (चर के लिए) या पूरे विधि के दायरे पर लागू होता है।

1

मेरे लिए ठीक संकलित (अप्रासंगिक कोड निकालने के लिए सरलीकृत):

public static class Test<T> { 
    T[] array; 

    public void a() { 
     @SuppressWarnings("unchecked") 
     T[] a = (T[]) new Object[1]; 
     this.array = a; 
    } 

    @SuppressWarnings("unchecked") 
    public void b() { 
     this.array = (T[]) new Object[1]; 
    } 
} 

नोट के केवल अवलोकन है कि @SuppressWarningsविधि बजाय b() में कोड लाइन पर चला जाता है दमन होने के कारण एक क्षेत्र काम के बजाय स्थानीय चर काम

+0

ने पहले की टिप्पणी को हटा दिया था, जो आपके संपादन से पहले लिखा गया था :) एक अच्छा के लिए +1 स्पष्टीकरण – posdef

+0

@ बोहेमियन लेकिन मेरे मामले के लिए विधि 'बी' में अन्य बयान हैं और मैं यथासंभव स्प्रैड के रूप में SuppressWarnings को रखना चाहता हूं। – Pacerier

5

पर चूंकि आप केवल टिप्पणी कर सकते हैं:

  • कक्षाएं
  • तरीकों
  • चर
  • मापदंडों
  • संकुल

आप भाव या बयान पर टिप्पणी नहीं कर सकता।

+0

और कभी-कभी केवल उन लोगों का एक सबसेट होता है यदि 'Target (ElementType []) 'एनोटेशन का उपयोग किया जाता है। – wchargin

संबंधित मुद्दे