2014-04-03 49 views
3

我正在從數據庫中獲取一些信息。我有一個方法使得給定表的對象的ArrayList。像工具,客戶等從ArrayList到陣列的對象

我想知道是否有可能做一個小的幫助方法,需要一個ArrayList並返回一個列表(工具[])動態的內容類型或我必須爲每種類型的對象創建方法?有沒有更加動態的方法來解決它?


這不是方法,但是對於給定類型的對象的方法的一個例子,不打擾有關編譯和邏輯中的代碼,它只是用於示例:

public Verktoy[] ToolsArray(ArrayList<Verktoy> b){ 
    Verktoy[] a = new Verktoy[b.size()]; 
    for(int i = 0; i<b.size(); i++){ 
     a[i] = b.get(i); 
    } 
    return a; 
} 
+0

可能的重複:http://stackoverflow.com/questions/7969023/from-arraylist-to-array – csvan

+0

不重複,有搜索和看到一個:) – simonkaspers1

+0

*「return a list(Tool [])」*你能否澄清這部分,我不知道'list(Tool [])應該傳達什麼。 – Radiodef

回答

1

所以基本上你想要的方法簽名是這樣的:

public static <E> E[] toArray(List<E> list); 

而且用法是:現在

List<String> strList = new ArrayList<String>(); 
String[] strArr = toArray(strList); 

List<Integer> intList = new ArrayList<Integer>(); 
Integer[] intArr = toArray(intList); 

,如前所述,List已經定義了一個方法,除了它不是通用的。你必須給它一個數組來複制或使用Object[]

List<String> strList = new ArrayList<String>(); 
Object[] objArr = strList.toArray(); 
String[] strArr = strList.toArray(new String[strList.size()]); 

我認爲這些都不是你想要的。不幸的是,沒有一種方法可以完全滿足您的要求,因爲您無法在Java中一般創建數組。讓我們再回到方法:

public static <E> E[] toArray(List<E> list) { 
    E[] arr = new E[list.size()]; // doesn't compile 

    return list.toArray(arr); 
} 

在於Eerased的問題,所以這不是編譯Java代碼。運行時不存在<E>以能夠執行new E

這樣你就可以得到最接近的是這樣的:

public static <E> E[] toArray(List<E> list, Class<E> e) { 
    @SuppressWarnings("unchecked") 
    final E[] arr = (E[])Array.newInstance(e, list.size()); 

    return list.toArray(arr); 
} 

但是,這是不是真的任何使用起來更加方便:

List<String> strList = new ArrayList<String>(); 
String[] strArr = toArray(strList, String.class); 

還有另一種有趣的方法是延長ArrayList並添加此功能。但是您仍然需要Class<E>對象。你會做這樣的:

import java.util.Arraylist; 
import java.util.Objects; 
import java.lang.reflect.Array; 

public class TypedList<E> extends ArrayList<E> { 
    private final Class<E> e; 

    public TypedList(Class<E> e) { 
     this.e = Objects.requireNonNull(e); 
    } 

    @Override 
    public E[] toArray() { 
     @SuppressWarnings("unchecked") 
     final E[] arr = (E[])Array.newInstance(e, size()); 
     return toArray(arr); 
    } 
} 

這可以讓你在一開始就指定Class<E>,以後你可以叫toArray不帶任何參數,例如:

TypedList<String> strList = new TypedList<String>(String.class); 
String[] strArray = strList.toArray(); 

我推薦的是轉向試圖一般使用數組。他們不適合這種類型的東西。

+0

所以沒有像C語言一樣的id []? – simonkaspers1

1

是的,你可以 - 這是仿製藥的目的。你可以這樣做:

List<T> list = new ArrayList<T>(); 
T [] elements = list.toArray(new T[list.size()]); 
+0

您是在暗示泛型數組的創建(這是一個編譯錯誤)? – Radiodef

+0

我不知道我回來的是什麼樣的數組嗎?或者它像obj.c中的'id'? – simonkaspers1