2010-10-20 5 views
7

संभव डुप्लिकेट:
Is it possible to solve the “A generic array of T is created for a varargs parameter” compiler warning?जावा: प्रकार की सुरक्षा: एक के एक सामान्य सरणी एक varargs पैरामीटर के लिए बनाई गई है

पर विचार करें यह दिया जाता है:

interface A<T> { /*...*/ } 
interface B<T> extends A<T> { /*...*/ } 
class C { /*...*/ } 
void foo(A<T>... a) { /*...*/ } 

अब , कुछ अन्य कोड foo का उपयोग करना चाहते हैं:

B<C> b1 /* = ... */; 
B<C> b2 /* = ... */; 
foo(b1, b2); 

यह मैं चेतावनी

Type safety : A generic array of A is created for a varargs parameter 

देता है तो मैं इस के लिए कॉल बदल दिया है:

foo((A<C>) b1, (A<C>) b2); 

यह अभी भी मुझे एक ही चेतावनी देता है।

क्यों? मैं कैसे इसे ठीक कर सकता हूं?

उत्तर

14

तुम सब कर सकते हैं वास्तव में क्या @SuppressWarnings("unchecked") साथ उस चेतावनी को दबाने है। जावा 7 क्लाइंट कोड के लिए उस चेतावनी को खत्म कर देगा, इसे कॉल साइट के बजाए foo(A... a) की घोषणा में ले जायेगा। परियोजना सिक्का प्रस्ताव here देखें।

+3

उल्लेख परियोजना सिक्का सुविधा अब उपलब्ध है - देखें [ @SafeVarargs] (http://docs.oracle.com/javase/7/docs/api/java/lang/SafeVarargs.html) जावा 7 में –

5

संपादित करें: उत्तर है कि प्रश्न के अनुसार अपडेट कर एक को दिखाने के लिए अद्यतन किया गया था वास्तव में सामान्य है।

मुझे लगता है कि ए त्रुटि प्राप्त करने के लिए एक सामान्य होना चाहिए। क्या आपकी परियोजना में एक सामान्य है, लेकिन उपरोक्त कोड नमूना सामान्य घोषित करता है?

यदि हां, तो क्योंकि एक सामान्य है, आप के आसपास सफाई से चेतावनी काम नहीं कर सकता। Varargs एक सरणी का उपयोग कर रहे कार्यान्वित किया है और एक सरणी सामान्य सरणियों का समर्थन नहीं करता जैसा कि यहां बताया:

Java generics and varargs

+0

हां यह है। मुझे लगता है कि मैंने उदाहरण को बहुत सरल बना दिया है। वह बदल जाएगा। – Albert

0

आप इस कोशिश कर सकते हैं:

<T> void foo(T... a) { /*...*/ }