2011-10-22 11 views
15

जावा 7 में में, आप पैरामीटर varargs चेतावनी आप जब एक गैर reifiable के साथ एक विधि संकलन मिल को दबाने के लिए एक @SafeVarargs एनोटेशन डाल करने के लिए विकल्प होता है। परियोजना सिक्का के proposal उल्लेख है कि एनोटेशन जब विधि सुनिश्चित करता है कि varargs पैरामीटर के रूप में एक ही प्रकार के केवल तत्वों varargs सरणी में जमा हो जाती है इस्तेमाल किया जाना चाहिए।सरलीकृत varargs विधि प्रार्थना किए जावा 7

क्या एक गैर सुरक्षित विधि का एक उदाहरण हो सकता है?

उत्तर

21

उदाहरण के लिए, foo() सुरक्षित नहीं है, यह गैर-टी सरणी में, [2]

<T extends List<?>> void foo(T... args) 
{ 
    List<String>[] array2 = (List<String>[])args; 
    array2[0] = a_list_of_string; 
} 

void test2() 
{ 
    List<Integer>[] args = ...; // [1] 
    foo(args); 
    Integer i = args[0].get(0); // [2] 
} 

में समस्या खड़ी कर रहा संग्रहीत कर सकते हैं @SafeVarargs साथ विधि चिह्नित करके, आप संकलक करने के लिए है कि आप कर रहे हैं वादा ऐसा कुछ शरारती नहीं कर रहा है।


लेकिन कैसे नरक में हम [1] शुरू करने के लिए एक सामान्य सरणी प्राप्त कर सकते हैं? जावा जेनेरिक सरणी निर्माण की अनुमति नहीं देता है!

है

केवल सामान्य सरणी सृष्टि के मंजूर तरह से जब एक vararg विधि

foo(list_int_1, list_int_2) 

तो सरणी फोन करने वाले के लिए सुलभ नहीं है बुला, फोन करने वाले ऐसा नहीं कर सकते [2] वैसे भी, यह कोई बात नहीं कैसे foo() सरणी के साथ messes।

लेकिन तब आप इसके बारे में सोचते हैं, यह सामान्य सरणी

@SafeVarargs 
static <E> E[] newArray(int length, E... array) 
{ 
    return Arrays.copyOf(array, length); 
} 

List<String>[] array1 = newArray(10); 

और जेनेरिक शाब्दिक शृंखला

@SafeVarargs 
static <E> E[] array(E... array) 
{ 
    return array; 
} 

List<String>[] array2 = array(list1, list2); 

तो हम सामान्य सरणी सब के बाद बना सकते हैं बनाने के लिए है पिछले दरवाजे। .. मूर्ख जावा, हमें ऐसा करने से रोकने की कोशिश कर रहा है।

+1

आप विभिन्न प्रकार के तरीकों के बिना जेनेरिक सरणी बना सकते हैं, लेकिन आपको [Array # newInstance (कक्षा प्रकार, int लंबाई)] (http://tinyurl.com/3uzbb7v) का उपयोग करना होगा और इसे कास्ट करना होगा। पूरी तरह से जवाब के लिए धन्यवाद। – Jeffrey

+0

वास्तव में एक "सरलीकरण" नहीं है, लेकिन एक बेहतर संकेत है। –

+0

इम इस उदाहरण की कोशिश कर रहा है और मैं के साथ और @SafeVarargs का उपयोग किए बिना व्यवहार में कोई बदलाव देखते हैं। मुझे अभी भी एक चेतावनी मिलती है "टाइप सुरक्षा: सूची की एक सामान्य सरणी ...." – excalibur

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