所以基本上你想要的方法簽名是這樣的:
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);
}
在於E
是erased的問題,所以這不是編譯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();
我推薦的是轉向試圖一般使用數組。他們不適合這種類型的東西。
可能的重複:http://stackoverflow.com/questions/7969023/from-arraylist-to-array – csvan
不重複,有搜索和看到一個:) – simonkaspers1
*「return a list(Tool [])」*你能否澄清這部分,我不知道'list(Tool [])應該傳達什麼。 – Radiodef