为什么Java不允许“new List <t>”?</t>

时间:2010-07-05 13:00:28

标签: java generics

要创建List,为什么Java不允许创建它们然后逐个添加元素?

这有效:

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;
}

4 个答案:

答案 0 :(得分:16)

java.util.Collections.emptyList();

  

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

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

其定义:

  

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

来自Java sun reference

的报价

编辑:

要创建新列表,您可以使用例如

List myList = new ArrayList<MyClass>();

答案 1 :(得分: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 :(得分: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

答案 3 :(得分:1)

通过以下方式创建一个新的arrayList:

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

列表只是一个界面...你不能创建一个新界面。你只能实现它。