java:为什么comp.在声明期间使用{}初始化数组时出错

A K*_*A K 1 java arrays initialization

如果我尝试在声明语句以外的语句上使用大括号初始化数组,为什么会出现编译错误

class Demo {
    public static void main(String[] args) {
        String[] myName;
            myName = {"AA", "BB", "CC"};
        for(String s: myName) {
            System.out.print(s + " ");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

只在声明语句中使用大括号初始化有什么意义?

demo.java:4: error: illegal start of expression
                myName = {"AA", "BB", "CC"};
                         ^
demo.java:4: error: not a statement
                myName = {"AA", "BB", "CC"};
                          ^
demo.java:4: error: ';' expected
                myName = {"AA", "BB", "CC"};
                              ^
demo.java:5: error: illegal start of type
                for(String s: myName) {
                ^
demo.java:5: error: ')' expected
                for(String s: myName) {
                            ^
demo.java:5: error: <identifier> expected
                for(String s: myName) {
                                    ^
demo.java:10: error: class, interface, or enum expected
}
^
7 errors
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 7

如果我尝试在声明语句以外的语句上使用大括号初始化数组,为什么会出现编译错误

因为基本上在Java中执行它是无效的.编译器只是强制执行Java语言规范的规则.您需要指定数组类型:

myName = new String[] { ... };
Run Code Online (Sandbox Code Playgroud)

Java语言规范,第10.6节:

可以在声明(第8.3节,第9.3节,第14.4节)中指定数组初始值设定项,或者作为数组创建表达式(第15.10节)的一部分,以创建数组并提供一些初始值.

声明的各个部分包括这个制作:

VariableInitializer:
    Expression
    ArrayInitializer
Run Code Online (Sandbox Code Playgroud)

而数组创建表达式(第15.10节)是:

ArrayCreationExpression:
    new PrimitiveType DimExprs Dimsopt
    new ClassOrInterfaceType DimExprs Dimsopt
    new PrimitiveType Dims ArrayInitializer 
    new ClassOrInterfaceType Dims ArrayInitializer

DimExprs:
    DimExpr
    DimExprs DimExpr

DimExpr:
    [ Expression ]

Dims:
    [ ]
    Dims [ ]
Run Code Online (Sandbox Code Playgroud)

后来:

只在声明语句中使用大括号初始化有什么意义?

我怀疑它在其他方面简化了语言规范.我同意你看起来应该能够做到这一点 - 你可能希望编译器能够从变量类型推断出数组类型,就像在声明时那样.但请记住,在一般情况下,大部分的语言,赋值运算符的右侧表达式的类型受到赋值的目标.对于正常语句中的每个表达式类型而言,通常在语言术语上更整洁,以便在不引用同一语句中的其他表达式的情况下进行良好定义.

使用数组创建表达式修复代码是相当容易的修复,所以我会忍受它.


NPE*_*NPE 5

语法的正确写法是:

myName = new String[]{"AA", "BB", "CC"};
Run Code Online (Sandbox Code Playgroud)

我怀疑Java不允许省略的原因new String[]是,在许多情况下,编译器无法从元素类型中找出所需的数组类型。假设您被允许写:

{1, 2, 3}
Run Code Online (Sandbox Code Playgroud)

那是int[]Integer[]Number[]Object[]

唯一可以忽略的地方new String[]是初始化程序,在该程序中编译器已经知道数组类型。