2017-04-12 61 views
-1
import java.util.*; 
public class Main { 
    public static void main(String[] args) { 

    List list1 = new ArrayList(); 
     list1.add(1); 
     list1.add(2); 
     list1.add(3); 

     Class myClass = list1.getClass(); 
     Object list2 = myClass.newInstance(); //I want to create the same object like list1 

     System.out.println(list1.getClass()); //result: class java.util.ArrayList 
     System.out.println(list2.getClass()); //result: class java.util.ArrayList 

} 
} 

如何添加一些元素到list2對象, 就像我用list1對象做的那樣。例如:list2.add(4);如何將新元素添加到從newInstance()方法獲取的ArrayList對象?

+1

你爲什麼要使用'newInstance'呢? –

+0

投它並添加它。示例 - >((List)list2).add(4) – RajatJ

+0

因爲我正在學習java,所以我有這樣的任務。例如,我不知道對象的類,我應該創建未知類的新對象。我只是簡單地提出一個問題 – OFUSs

回答

0

你將它轉換爲List

List list2 = (List)myClass.newInstance(); 

...然後使用它作爲正常。

要使用特定方法,您需要一個具有這些方法的類型的引用。例如,List具有各種List方法。如果您需要使用ArrayList特定方法(如ensureCapacity),則需要使用ArrayList而不是上面的List

如果您不確定演員使用什麼班級,但您擁有合理的班級設置,則可以使用list2 instanceof x或甚至list2.getClass() == x.getClass(),直到您知道並使用該班級。


如果您不知道對象是什麼,但很清楚,你需要在其上調用方法的簽名,然後你會使用反射(java.reflect)。例如,我們知道,add接受Object類型的一個參數,因此:

Object list2 = myClass.newInstance(); 
String methodName = "add"; 
Class[] paramTypes = {Object.class}; 
Method method = list2.getClass().getMethod(methodName, paramTypes); 
method.invoke(list2, new Object[] { 4 }); 

你必須知道的東西關於對象。我的意思是,你可以問它有什麼方法(參見Class的各種方法),並且你可以得到它們的參數類型,但是如果你不知道它們是什麼,你不能稱它們有意義。

+0

但是,如果我在編譯時刻之前不知道我的新對象的類,怎麼辦? – OFUSs

+0

如果您知道可以從中找到對象的列表,請在if-else情況下查看instanceof,然後鍵入cast並使用該對象。 –

+0

@OFUSs:我添加了關於反射的註釋。 –

0

你可以如下做到,

List<Integer> list1 = new ArrayList<Integer>(); 
    list1.add(1); 
    list1.add(2); 
    list1.add(3); 

    Class myClass = list1.getClass(); 
    Object list2 = myClass.newInstance(); //I want to create the same object like list1 

    Method m = myClass.getDeclaredMethod("add", new Class[] {Object.class}); 
    m.invoke(list2, 4); 

    for(int i : (List<Integer>)list2) { 
     System.out.println(i); 
    }