उदाहरण के लिए, 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);
तो हम सामान्य सरणी सब के बाद बना सकते हैं बनाने के लिए है पिछले दरवाजे। .. मूर्ख जावा, हमें ऐसा करने से रोकने की कोशिश कर रहा है।
आप विभिन्न प्रकार के तरीकों के बिना जेनेरिक सरणी बना सकते हैं, लेकिन आपको [Array # newInstance (कक्षा > प्रकार, int लंबाई)] (http://tinyurl.com/3uzbb7v) का उपयोग करना होगा और इसे कास्ट करना होगा। पूरी तरह से जवाब के लिए धन्यवाद। – Jeffrey
वास्तव में एक "सरलीकरण" नहीं है, लेकिन एक बेहतर संकेत है। –
इम इस उदाहरण की कोशिश कर रहा है और मैं के साथ और @SafeVarargs का उपयोग किए बिना व्यवहार में कोई बदलाव देखते हैं। मुझे अभी भी एक चेतावनी मिलती है "टाइप सुरक्षा: सूची की एक सामान्य सरणी ...." –
excalibur