ArrayList初始化错误

3

我需要初始化ArrayLists,但遇到了问题。

当我使用NetBeans 7.3时,我尝试执行以下操作:

protected Stack<Scope> scopeStack;
protected ArrayList<Scope> allScopes;
scopeStack = new Stack<>();
allScopes = new ArrayList<>();

这个文件已经完美编译并且运行顺畅。

但是当我使用Linux命令行编译Java时,它会报错。

src/SymbolTable.java:28: illegal start of type scopeStack = new Stack<>();      
SymbololTable.java:29: illegal start of type allScopes = new ArrayList<>();

这是由于不同版本的Java编译器引起的吗?还是有其他原因导致的?

3
这是Java 1.7与1.6版本的区别所在 -- 1.6版本不支持使用<> "菱形" 泛型推断语法。 - Thomas W
我认为你是正确的。那是版本错误。谢谢! - Sherwood Lee
3个回答

10

我猜你在Netbeans中使用的是Java 1.7,而在Linux中使用的是Java 1.6。

"钻石操作符"仅在Java 7中引入。

使用javac -version命令查看编译器的版本。


2

如果您使用的是Java 6,则初始化时需要定义类型,如下所示:

scopeStack = new Stack<Scope>();
allScopes = new ArrayList<Scope>();

2
在Java 7中,<>“钻石”泛型类型推断操作符应该可以避免指定泛型类型的需要,如果可以推断出来。他的问题是他正在使用Linux编译器上的Java 6(或Java 6输出兼容性),这会失败。 - Thomas W
@ThomasW 首先,我们不知道他是否在使用Java 7,如果不是,他就必须推断出来。我不理解为什么要踩。如果他从Java 7转到Java 6,那么他就必须指定类型...我认为这不应该被踩。 - BlackHatSamurai
我从Java 7特定的语法中理解了这个问题,他在使用Java 7(在那个可行的盒子上)。请参阅http://docs.oracle.com/javase/tutorial/java/generics/types.html#diamond和https://dev59.com/Gm855IYBdhLWcg3wvnKE以了解有关此新语法的讨论。 - Thomas W
Blaine:像你这样的反应是为什么很多人从不留下评论而选择 down vote 的原因。/cc @ThomasW - Andrew Barber
抱歉造成困惑。一开始,我不确定Linux和我的电脑之间的版本是否不同。所以我没有暗示那个。无论如何,非常感谢大家回答这个问题!! - Sherwood Lee

0
你应该在new调用中指定集合的类型,并在适当的位置初始化字段。可以尝试以下两种方法之一:

内联初始化字段

protected Stack<Scope> scopeStack = new Stack<Scope>();
protected ArrayList<Scope> allScopes = new ArrayList<Scope>();

在构造函数中初始化字段

public class MyClass {
  protected Stack<Scope> scopeStack;
  protected ArrayList<Scope> allScopes;

  public MyClass() {
    scopeStack = new Stack<Scope>();
    allScopes = new ArrayList<Scope>();
  }
}

与他的问题无关,关于Java 7的钻石语法<>是不正确的。不过我同意在声明或构造函数中初始化。 - Thomas W

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接