2009-07-02 23 views
23

मैं आज बहुत ही बुनियादी लेकिन बेहद परेशान हो गया। मुझे एक सूची को एक सरणी में बदलने की जरूरत है। सूची में String उदाहरण शामिल थे। List.toArray(T[]) का उपयोग करने का सही उदाहरण, क्योंकि मैं String[] उदाहरण चाहता था। हालांकि, यह परिणाम String[] पर स्पष्ट रूप से कास्टिंग किए बिना काम नहीं करेगा।List.toArray (टी []) के विषम जेनेरिक व्यवहार

import java.util.Arrays; 
import java.util.List; 

public class MainClass { 
    public static void main(String args[]) { 
     List l = Arrays.asList("a", "b", "c"); 
     String stuff[] = l.toArray(new String[0]); 
     System.err.println(Arrays.asList(stuff)); 
    } 
} 

जो संकलन नहीं करता है:

एक परीक्षण परिदृश्य के रूप में, मैं निम्नलिखित कोड का इस्तेमाल किया। मैं String[] करने के लिए एक डाली यह संकलन और पूरी तरह से चलेंगे जोड़ देते हैं तो

MainClass.java:7: incompatible types 
found : java.lang.Object[] 
required: java.lang.String[] 
    String stuff[] = l.toArray(new String[0]); 
         ^

: यह लगभग javadoc में उदाहरण के एक सटीक प्रतिलिपि है, अभी तक संकलक निम्नलिखित कहते हैं। लेकिन उस नहीं है मैं क्या उम्मीद है जब मैं toArray विधि के हस्ताक्षर को देखा:

<T> T[] toArray(T[] a) 

यह मुझसे कहता है मैं कास्ट करने के लिए नहीं होना चाहिए कि। क्या हो रहा है?

संपादित करें:

मजे की बात है, अगर मैं करने के लिए सूची घोषणा बदलने के लिए:

List<?> l = Arrays.asList("a", "b", "c"); 

यह भी काम करता है। या List<Object>। इसलिए सुझाव दिया गया था कि यह List<String> होना आवश्यक नहीं है। मुझे लगता है कि कच्चे List प्रकार का उपयोग करके यह भी बदलता है कि उस वर्ग के अंदर सामान्य तरीके कैसे काम करती हैं।

दूसरा संपादन:

मुझे लगता है कि मुझे अब यह मिल गया है। नीचे टिप्पणी में टॉम Hawtin क्या लिखा सबसे अच्छा स्पष्टीकरण लगता है। यदि आप कच्चे तरीके से सामान्य प्रकार का उपयोग करते हैं, तो उस उदाहरण से सभी जेनेरिक जानकारी संकलक द्वारा मिटा दी जाएगी। आप सुरक्षा लिख ​​सकते हैं इस मामले में

List<String> l = Arrays.asList("a", "b", "c"); 

:

String[] a = l.toArray(new String[0]); 

किसी भी डाली बिना

उत्तर

29

आप अपनी सूची के लिए प्रकार पैरामीटर निर्दिष्ट करने के लिए भूल गया था।

+1

के बारे में और पढ़ें यह मुझे तर्कसंगत रूप से समझता है, लेकिन तकनीकी रूप से नहीं। यह मुझे नहीं देखता है कि toArray विधि परवाह करता है कि ई किसके लिए बाध्य है (यानी, सूची का तत्व वर्ग)। – waxwing

+1

toArray का हस्ताक्षर "सार्वजनिक टी [] toArray (टी [] ए)", टी – dfa

+0

में पारित सरणी का घटक प्रकार है, मैं इसे भी समझ नहीं पा रहा हूं, इससे भी बदतर यह है कि यह एक सूची का उपयोग करके भी काम करता है (या सूची ) "एल" –

1
List<String> l = Arrays.asList("a", "b", "c"); 

यह संकलन, आप जेनरिक का उपयोग कर रहे कहने के लिए कर देगा तो toArray विधि जानता सरणी के प्रकार के वापस जाने के लिए जो "इस तार की एक सूची है।"

0

ऐसा इसलिए है क्योंकि आपकी सूची में ऑब्जेक्ट्स हैं, तार नहीं। अगर आपने अपनी सूची List<String> के रूप में घोषित की है, तो संकलक खुश होगा।

3

या

List<?> l = Arrays.asList("a", "b", "c"); 

करना अभी भी अजीब

+0

+1। यह समस्या को हल करता है - मैंने खुद को एक ही अजीबता देखी। – waxwing

+1

सबसे खराब: यह सूची का उपयोग करके भी संकलित करता है लेकिन रनटाइम पर क्रैश होना चाहिए ...: - / –

0

List बिना घोषित प्रकार जबकि List<?> का अर्थ है "ऑब्जेक्ट की सूची" लागू हो जाएगी "अज्ञात की सूची"।जेनेरिक प्रकारों की दुनिया में यह एक तथ्य है कि "ऑब्जेक्ट की सूची" स्ट्रिंग की सूची से अलग है लेकिन संकलक "अज्ञात सूची" के लिए ऐसा नहीं कह सकता है। यदि आपने इसे अज्ञात घोषित कर दिया है, तो जहां तक ​​संकलक बता सकता है, यह ठीक है।

मुख्य बिंदु यह है कि वाइल्डकार्ड के रूप में कुछ घोषित करना? ऑब्जेक्ट के रूप में घोषित करने से अलग है। वाइल्डकार्ड here

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