2009-05-25 16 views
13

ठीक है, मेरे पास एक क्लास ग्राहक है (कोई बेस क्लास नहीं)।जावा में जेनेरिक सूची प्रकार कैसे डालें?

मुझे लिंक्डलिस्ट से सूची में डालना होगा। क्या ऐसा करने का कोई साफ तरीका है?

बस इतना ही आपको पता है, मुझे इसे सूची में डालना होगा। कोई अन्य प्रकार नहीं करेगा। (मैं स्लिम और फिटनेस का उपयोग कर एक परीक्षण स्थिरता विकसित कर रहा हूं)।


संपादित करें: ठीक है, मुझे लगता है कि मुझे यहां कोड उदाहरण देना होगा।

import java.util.*; 
public class CustomerCollection 
{ 
    protected LinkedList<Customer> theList; 

    public CustomerCollection() 
    { 
     theList = new LinkedList<Customer>(); 
    } 

    public void addCustomer(Customer c){ theList.add(c); } 
    public List<Object> getList() 
    { 
     return (List<? extends Object>) theList; 
    } 
} 

तो युवाल ए की टिप्पणियों के अनुसार, मैंने आखिरकार कोड को इस तरह लिखा है। लेकिन मुझे यह त्रुटि मिलती है:

CustomerCollection.java:31: incompatible types 
found : java.util.List<capture#824 of ? extends java.lang.Object> 
required: java.util.List<java.lang.Object> 
     return (List<? extends Object>)theList; 
      ^
1 error 

तो, इस कलाकार को करने का सही तरीका क्या है?

+0

आप शुरू से ही कोड उदाहरण देना चाहिए की मिश्रित प्रकार के साथ एक गैर सामान्य सूची पारित काम नहीं करेगा , मैं अपना जवाब एक सेकंड में अपडेट करूंगा ... –

उत्तर

25

आपको कास्ट करने की आवश्यकता नहीं है। LinkedList लागू List इसलिए आपके पास यहां करने का कोई कास्टिंग नहीं है।

यहां तक ​​कि जब आप एक Object की List रों करने के लिए नीचे-कास्ट करना चाहते हैं तो आप इसे निम्नलिखित कोड में की तरह जेनरिक के साथ क्या कर सकते हैं:

LinkedList<E> ll = someList; 
List<? extends Object> l = ll; // perfectly fine, no casting needed 

अब, मैं समझ आपके संपादन के बाद आप क्या करने की कोशिश कर रहे हैं , और यह कुछ ऐसा है जो संभव नहीं है, एक नया List इसलिए की तरह बनाने के बिना है:

LinkedList<E> ll = someList; 
List<Object> l = new LinkedList<Object>(); 
for (E e : ll) { 
    l.add((Object) e); // need to cast each object specifically 
} 

और मैं समझाऊंगा कि ऐसा क्यों नहीं तो संभव नहीं है। इस पर विचार करें:

LinkedList<String> ll = new LinkedList<String>(); 
List<Object> l = ll; // ERROR, but suppose this was possible 
l.add((Object) new Integer(5)); // now what? How is an int a String??? 

अधिक जानकारी के लिए, Sun Java generics tutorial देखते हैं। उम्मीद है कि यह स्पष्ट करता है।

+0

आप मेरी बात याद करते हैं। विचार करें: [कोड] लिंक्डलिस्ट ll = कुछ सूची; सूची एल = ll [/ कोड]। यह ठीक है? मेरा मतलब यह है। – jrharshath

+0

क्या आपने कहा था, लेकिन समस्या बनी हुई है। कोड उदाहरण और त्रुटि का सामना करने के लिए प्रश्न संपादित किया। – jrharshath

+0

ठीक है, बिंदु मिला। बहुत बहुत धन्यवाद :) – jrharshath

0

LinkedList लागू करता सूची है, तो आप

List<String> list1 = new LinkedList<String>(); 

लागू कर सकते हैं या आप < पूर्णांक> सूची में LinkedList < स्ट्रिंग से कास्ट करने के लिए> चाहते हैं? इस मामले में आपको प्रत्येक तत्व को चुनना होगा और इसे एक पूर्णांक में परिवर्तित करना होगा।

+0

मैं LinkedList से सूची में कनवर्ट करना चाहता हूं। वह (मुझे लगता था) स्वचालित होना चाहिए, coz LinkedList IS_A सूची, और स्ट्रिंग IS_A ऑब्जेक्ट होना चाहिए। लेकिन मुझे आज पता चला कि यह नहीं है। :( – jrharshath

-1

सूची एक इंटरफेस है, लिंक्डलिस्ट उस इंटरफेस का एक ठोस कार्यान्वयन है। ज्यादातर समय एक निहित कलाकार काम करेगा, एक लिंक्डलिस्ट को एक सूची में असाइन करेगा, या किसी सूची की अपेक्षा रखने वाले फ़ंक्शन को पास करेगा और इसे केवल 'कार्य' करना चाहिए।

यदि आवश्यक हो तो एक स्पष्ट कलाकार भी किया जा सकता है।

//This is valid 
List<Customer> myList = new LinkedList<Customer>(); 

//Also Valid 
List<Customer> myList = (List<Customer>) new LinkedList<Customer>(); 
+2

एक स्पष्ट कलाकार कभी जरूरी नहीं है। –

+2

यह आवश्यक नहीं है – Joset

+3

-1 क्योंकि यह इंटरफ़ेस –

1
> public List<Object> getList() 

आप सूची < वस्तु > क्यों लौट रहे हैं? साथ ही आप वापस कर सकती है सूची (जेनरिक के बिना) के बाद से है कि बराबर है लेकिन निम्नलिखित कोड काम होगा: मुश्किल

LinkedList<Customer> theList = new LinkedList<Customer>(); 

public List getList() { 
    return theList; 
} 

विभिन्न सामान्य प्रकार के साथ सूचियाँ के बीच कास्टिंग है और यहां अनावश्यक लगता है।

बेशक

आप लौटने किया जाना चाहिए प्रकार सूची < ग्राहक > ...

0

आप अपने विधि से एक List<?> लौटना चाहिए। सहजता से, getList() एक सूची देता है ताकि कॉलर अंदर आइटम पुनर्प्राप्त कर सके। List<?> (जो List<? extends Object> के समतुल्य है) उस कार्यक्षमता को अनुमति देता है। हालांकि, आप लौटाई गई सूची के माध्यम से इसमें कुछ भी नहीं डाल पाएंगे, क्योंकि यह सुरक्षित नहीं होगा; लेकिन मुझे नहीं लगता कि वही है जो आपको चाहिए।

public List<?> getList() 
{ 
    return theList; 
} 
17

कास्टिंग करने के लिए यहां मेरा भयानक समाधान है। मैं जानता हूँ कि, मुझे पता है, मैं जंगली में कुछ इस तरह रिहा नहीं किया जाना चाहिए, लेकिन यह किसी भी प्रकार के किसी भी वस्तु कास्टिंग के लिए काम में आ गया है:

public class UnsafeCastUtil { 

    private UnsafeCastUtil(){ /* not instatiable */} 

    /** 
    * Warning! Using this method is a sin against the gods of programming! 
    */ 
    @SuppressWarnings("unchecked") 
    public static <T> T cast(Object o){ 
     return (T)o; 
    } 

} 

उपयोग:

Cat c = new Cat(); 
Dog d = UnsafeCastUtil.cast(c); 

अब मैं

0

सिर्फ

public static List<Object> getList() { 
    List l = test; 
    return l; 
} 
2

मुझे लगता है कि के लिए इस समारोह किया डाल मेरी पापों के लिए प्रोग्रामिंग के देवताओं से प्रार्थना करने जा रहा हूँ ..., बदसूरत लेकिन यह

public static <T> Collection<T> cast(Collection<? super T> collection, Class<T> clazz){ 
    return (Collection<T>)collection; 
} 
+2

और 'क्लाज़' का उपयोग नहीं है? इसका उपयोग नहीं किया जाता है? – nachokk

0

काम करता है अपनी सूची जैसे

के लिए एक सामान्य प्रकार का है

ArrayList<String> strList = new ArrayList<String>(); strList.add("String1"); Object o = strList;

उसके बाद निम्न विधि

public <T> List<T> getListObjectInBodyOfType(Class<T> classz, Object body) { 
    if(body instanceof List<?>){ 
     List<?> tempList = (List<?>)body; 
     if(tempList.size() > 0 && tempList.get(0).getClass().equals(classz)){ 
      return (List<T>) body; 
     } 
    } 
    return new ArrayList<T>(); 
} 

इसका उपयोग कैसे करें काम करना चाहिए है?

List<String> strList1 = getListObjectInBodyOfType(String.class, o); 

के रूप में मैंने पहले उल्लेख किया यह काम करता है अगर वस्तु सामान्य सूची है, इस लिए यदि आप तत्वों

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