2012-06-25 13 views
16

हम कुछ varargs फ़ंक्शंस का उपयोग करते हैं और जैसे ही हम जावा 1.7 पर जाते हैं, हमें एक अजीब अनचेक चेतावनी मिल रही है।जावा 1.7 varargs फ़ंक्शन अनचेक चेतावनी के रूप में रिपोर्ट किया गया

समारोह एक अंतरफलक में इंटरफ़ेस ICache

public interface ICache<O> { 
    void add(Object source, O... objects); 
} 

में जोड़ने त्रुटि की रिपोर्ट।

ICache.java:18: warning: [unchecked] Possible heap pollution from parameterized vararg type O 
    void add(Object source, O... objects); 
    where O is a type-variable: 
    O extends Object declared in interface ICache 
1 warning 

ओ ऑब्जेक्ट को अपनी जेनेरिक कैश क्लास के रूप में विस्तारित करता है।

मैंने xlint चेतावनियों को पढ़ा है और हम अनचेक किए गए संकलन करते हैं, लेकिन http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html#xlintwarnings यह इंगित करता है कि यह त्रुटि एक [varargs] प्रकार एक अनचेक प्रकार नहीं होना चाहिए।

मैं कुछ याद आ रही है?

+0

क्या हम आईसीएएच और कुछ क्लास के सभी प्रासंगिक भागों को देख सकते हैं? –

+0

स्रोत जोड़ने के लिए संपादित किया गया। –

+1

[इस आधिकारिक ओरेकल साइट] (http://docs.oracle.com/javase/7/docs/technotes/guides/language/non-reifiable-varargs.html) पर एक नज़र डालें, यह विस्तार से भिन्नता ढेर प्रदूषण बताता है , जावा 7 कंपाइलर चेतावनी क्यों उठाता है और आप इसे कैसे दबा सकते हैं। – buc

उत्तर

2

हीप प्रदूषण एक ऐसा शब्द है जो किसी ऑब्जेक्ट को इंगित करता है कि यह एक सामान्य प्रकार के साथ varargs का उपयोग करते समय सुपरटेप नहीं है। ऐसा तब होता है जब पैरामीटरयुक्त प्रकार का एक चर उस ऑब्जेक्ट को संदर्भित करता है जो उस पैरामीटरयुक्त प्रकार का नहीं है। This स्टैक ओवरफ़्लो पर पोस्ट आपको बताता है कि इसका क्या अर्थ है और आपको इसके बारे में क्या करना चाहिए, और @SafeVarargs एनोटेशन पर विवरण देता है। तो, इंटरफ़ेस ICache में, vararg प्रकार O आपके इंटरफ़ेस में Object पर इंगित कर रहा है, लेकिन OObject का सुपरटेप नहीं है, और यह एक ढेर प्रदूषण चेतावनी उत्पन्न करता है। ध्यान दें कि यह कैसे कहता है संभव ढेर प्रदूषण। यदि आपका कोड ClassCastException तक पहुंचने जैसी कोई समस्या नहीं पैदा कर रहा है, तो यह संभवतः सुरक्षित होगा और ढेर को प्रदूषित नहीं करेगा, लेकिन कंपाइलर के पास यह साबित करने का कोई तरीका नहीं है और ऑपरेशन की शुद्धता को सत्यापित नहीं कर सकता है, इसलिए यह अभी भी उत्पन्न होगा चेतावनी। यह वास्तव में एक अनचेक चेतावनी की परिभाषा है: जब पैरामीटरयुक्त प्रकार से जुड़े किसी ऑपरेशन की शुद्धता सत्यापित नहीं की जा सकती है। अधिक जानकारी के लिए this ओरेकल पृष्ठ गैर-भरोसेमंद प्रकारों पर देखें। यदि आप यह चेतावनी प्राप्त नहीं करना चाहते हैं, तो आप इसे SafeVarargs से रोक सकते हैं, या विधि घोषणा के लिए @SuppressWarnings ({"unchecked", "varargs"}) जोड़ कर इसे दबा सकते हैं, लेकिन इस विधि में आपको चेतावनी नहीं मिलेगी कि विधि वास्तव में असुरक्षित है।