2011-08-15 16 views
11

मेरे पास निम्न श्रेणी है जो ऑब्जेक्ट सरणी की एक सूची संग्रहीत करती है।जावा (क्यों <Object>) विधि को कॉल नहीं करेगा, अगर मेरे पास (ऑब्जेक्ट ...) है?

public class Test { 
    private List<Object[]> list = new ArrayList<Object[]>(); 

    public void addList(Object... obj) { 
     list.add(obj); 
    } 

    public void addList(List<Object> lst) { 
     list.add(lst.toArray()); 
    } 
} 

जब मैं निम्नलिखित फोन, अतिभारित विधि addList(Object... obj) कहा जाता है, लेकिन मैं addList(List<Object> lst) के नाम से जाना चाहते हैं। मैं यह कैसे कर सकता हूँ?

public class Main { 
    public static void main(String[] args) { 
     Test testObj = new Test(); 
     List<String> myStrings = new ArrayList<String>(); 
     myStrings.add("string 1"); 
     myStrings.add("string 2"); 
     myStrings.add("string 3"); 

     // The variable argument method is called but this is a list! 
     testObj.addList(myStrings); 

    }  
} 
+0

आपको 'सूची ' स्टोरेज सिस्टम से दूर जाने पर विचार करना चाहिए। जो कुछ भी आपका डेटा दिखता है, उसे कक्षाओं में मॉडलिंग करना और उन लोगों के साथ काम करना 'ऑब्जेक्ट' के समूह के बारे में तर्क देने की कोशिश करने से कहीं अधिक आसान होगा। – dlev

उत्तर

8

बदलें List<Object> अपने विधि बदलें। मैंने यह कोशिश की और इसे "सूची में" मुद्रित किया:

import java.util.ArrayList; 
import java.util.List; 

public class Test { 
    private List<Object[]> list = new ArrayList<Object[]>(); 

    public void addList(Object... obj) { 
     System.out.println("in object"); 
     list.add(obj); 
    } 

    public void addList(List<?> lst) { 
     System.out.println("in List<?>"); 
     list.add(lst.toArray()); 
    } 

    public static void main(String[] args) { 
     Test testObj = new Test(); 
     List<String> myStrings = new ArrayList<String>(); 
     myStrings.add("string 1"); 
     myStrings.add("string 2"); 
     myStrings.add("string 3"); 

     // The variable argument method is called but this is a list! 
     testObj.addList(myStrings); 

    } 
} 
6

List<String>List<Object> का एक उपवर्ग नहीं है। ताकि अगर आप ... संस्करण हटा दें तो भी अधिभार कभी नहीं कहा जाएगा।

7

किसी वाइल्डकार्ड का उपयोग करने के लिए आप गैर variadic विधि के प्रकार पुनर्लेखन:

public void addList(List<?> lst) { 
    list.add(lst.toArray()); 
} 

फिर List<String> पैरामीटर प्रकार की एक उप-प्रकार किया जाएगा।

2

वस्तु के किसी भी प्रकार की सूचियों पर कब्जा करने के List<?> करने के लिए

public void addList(List<?> lst) { 
    list.add(lst.toArray()); 
} 
संबंधित मुद्दे