4

err 部分在代码中大写,它也出现在 foreaching 中。由于抽象列表,无法初始化,声明在静态字段中。这些列表具有相同的类型。

import java.util.*;

public class Test
{

        public static final List<String> highPrio = Arrays.asList("*","/");
        public static List<String> ops;

        public static void main(String[] args)
        {
                //ERROR HERE, why do it throw nullPointer?
                ops.addAll(highPrio);

                for(String s : ops)
                {
                        System.out.println(s);
                }
        }
}

为什么不在初始化中使用 new List()?

不初始化的原因是无法使用= new List<String>(). 我看不到不允许这样做的逻辑。它必须与内在因素有关,例如数据结构或其他东西。

Test.java:7: java.util.List is abstract; cannot be instantiated public static List<String> ops = new List<String>();

为什么列表是一个接口?

我知道许多数据结构(例如堆栈实现列表)。但是我不明白为什么 List 是一个接口,而为什么不是 Table 。我将 list 视为一种原始结构,您可以使用它来实现其他结构。接口是您可以指定结构要求的东西。是接口的原始性还是扩展性的原因?

4

7 回答 7

12

因为 ops 为空。List 是一个接口这一事实并不意味着您不能初始化该字段:

public static List<String> ops = new ArrayList<String>();

List是一个接口,因为在提供相同合约的同时有多种实现方式(尽管性能特征不同)。例如,ArrayList是数组支持的,LinkedList而是链表。

于 2010-05-08T05:13:38.160 回答
4

您需要实例化操作列表。

public static List<String> ops = new ArrayList<String>();

或您选择的其他列表类型。

于 2010-05-08T05:13:44.150 回答
1

ops 永远不会被初始化。

您必须在ops = new ArrayList<String>();执行 addAll 命令之前执行此操作。否则,您正在调用一个空对象。

不能做ops = new List<String>' 的原因是因为 List 是一个接口,不能初始化。ArrayList 不是抽象类型,它扩展了 List,因此在这种情况下是合适的。

抽象类型和接口不能创建为实际对象,只能用于引用某个具体对象。具体类型必须扩展您尝试使用的抽象类型或接口。

于 2010-05-08T05:15:13.250 回答
1

你还没有初始化 List 操作;

例如

public static List<String> ops = new ArrayList<String>();

或者你可以做

import java.util.*;

public class Test
{

    public static List<String> ops;

    public static void main(String[] args)
    {
            ops = Arrays.asList(new String[] {"*", "/"});

            for(String s : ops)
            {
                    System.out.println(s);
            }
    }
}
于 2010-05-08T05:17:00.727 回答
1

ops 尚未初始化。

将声明更改为:

public static List<String> ops = new ArrayList<String>();
于 2010-05-08T05:17:17.590 回答
0

你在添加什么?变量ops仍然是 null,就像s下面的 is null 一样:

public static String s;
于 2010-05-08T05:37:31.200 回答
0

我认为你真正的问题是:

为什么我不能实例化一个列表?
为什么我得到:Test.java:7: java.util.List is abstract; cannot be instantiated public static List<String> ops = new List<String>();

在Java中,List是一个接口,正如你所说: Interface is a thing where you can specify requirements for a structure- 它就像一个需要填写的工作描述。但是你不能把工作描述从纸上剪下来,简单地用它来完成工作,即List工作描述is abstract; cannot be instantiated

相反,您需要候选人填补职位描述中描述的职位List。满足工作要求的候选人(“具体实现”)是ArrayListLinkedListVector等。除非您List<String> ops使用特定候选人初始化您的 var 来完成这项工作,否则您没有人 ( null) 来实际完成工作(那里通过提高一个NullPointerException.

List<String> ops = new ArrayList<String>();
于 2010-05-08T10:20:35.223 回答