2010-07-05 70 views
1

要创建一个List,为什么Java不允许创建它们,然后逐个添加元素?Java为什么不允许“新列表<T>”?

这工作:

public static List<TrackedItem> create(List<Item> items) 
{ 
    TrackedItem[] arr = new TrackedItem[items.size()]; 

    int i = 0; 
    for (Item item : items) 
    { 
     arr[i] = TrackedItem.createOrUpdate(item); 

     i++; 
    } 

    return java.util.Arrays.asList(arr); 
} 

这不起作用tracked.add()导致NullPointerException):

public static List<TrackedItem> create(List<Item> items) 
{ 
    List<TrackedItem> tracked = java.util.Collections.emptyList(); 

    for (Item item : items) 
    { 
     tracked.add(TrackedItem.createOrUpdate(item)); 
    } 

    return tracked; 
} 
+1

你确定你的代码会抛出一个NPE吗?因为它应该抛出'UnsupportedOperationException',因为'emptyList()'的返回值不能被修改(按设计)。 – 2010-07-05 13:06:19

+0

它抛出一个'NullPointerException'?真?它应该抛出一个'UnsupportedOperationException':http://java.sun.com/javase/6/docs/api/java/util/List.html#add(E) – 2010-07-05 13:06:48

+0

@Joachim:Jinx! – 2010-07-05 13:07:51

回答

16

java.util.Collections.emptyList();

静态 列表 的emptyList() 返回空的列表(不可变)。

这意味着,您将无法更改此列表。

其定义为:

静态列表EMPTY_LIST 空的列表(不可变的)。从

行情Java sun reference

编辑:

要创建可以使用例如一个新的列表

List myList = new ArrayList<MyClass>(); 
+0

+1:这里的问题是试图修改'Collections.emptyList()'返回的值,与通用参数无关。 – 2010-07-05 13:04:49

4

使用的语法如下:

public static List<TrackedItem> create(List<Item> items) 
{ 
    List<TrackedItem> tracked = new ArrayList<TrackedItem>(); 

    for (Item item : items) 
    { 
     tracked.add(TrackedItem.createOrUpdate(item)); 
    } 

    return tracked; 
} 
+2

注意您需要实例化一个特定类型的列表(在这种情况下,ArrayList,也可能是LinkedList等),您可以添加项目。 – 2010-07-05 13:04:51

2

这可能是一个误解。

即使它被称为emptyList,它不是一个只是空的列表,可以填充。这emptyList被设计为在任何时候都是空的。你不能添加到这个特殊的列表。

为了得到一个“可用”空的列表,你可以

List<String> list = new ArrayList<String>(); // create a new one or 
list.add("if you have an list"); 
list.clear();         // just clear it 
1

通过创建一个新的ArrayList:

List<T> tracked = new ArrayList<T>(); 

列表只是一个接口......你不能让一个新的一。你只能实现它。

相关问题