Java 爪哇:为什么是comp。在声明期间使用{}not初始化数组时出错

Java 爪哇:为什么是comp。在声明期间使用{}not初始化数组时出错,java,arrays,initialization,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 + " "); } } }

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

class Demo {
    public static void main(String[] args) {
        String[] myName;
            myName = {"AA", "BB", "CC"};
        for(String s: myName) {
            System.out.print(s + " ");
        }
    }
}
仅在声明语句中使用大括号进行初始化有什么意义

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
demo.java:4:错误:表达式的开始非法
myName={“AA”、“BB”、“CC”};
^
java:4:错误:不是语句
myName={“AA”、“BB”、“CC”};
^
java:4:错误:';'预期
myName={“AA”、“BB”、“CC”};
^
java:5:错误:类型的非法开始
for(字符串s:myName){
^
java:5:错误:“)”应为
for(字符串s:myName){
^
java:5:错误:应为
for(字符串s:myName){
^
java:10:错误:需要类、接口或枚举
}
^
7个错误

从语法上正确编写您要编写的内容的方法是:

myName = new String[]{"AA", "BB", "CC"};
我怀疑Java不允许省略
新字符串[]
的原因是,在许多上下文中,编译器无法从元素的类型中找出所需的数组类型。假设允许您编写:

{1, 2, 3}
那是
int[]
Integer[]
Number[]
还是
对象[]


唯一允许省略
新字符串[]
的地方是初始值设定项,编译器已经知道数组类型。

编写尝试编写的内容的语法正确方法是:

myName = new String[]{"AA", "BB", "CC"};
我怀疑Java不允许省略
新字符串[]
的原因是,在许多上下文中,编译器无法从元素的类型中找出所需的数组类型。假设允许您编写:

{1, 2, 3}
那是
int[]
Integer[]
Number[]
还是
对象[]

唯一允许省略
新字符串[]
的地方是初始值设定项,编译器已经知道数组类型

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

class Demo {
    public static void main(String[] args) {
        String[] myName;
            myName = {"AA", "BB", "CC"};
        for(String s: myName) {
            System.out.print(s + " ");
        }
    }
}
因为在Java中这样做基本上是无效的。编译器只是强制执行Java语言规范的规则。您需要指定数组类型:

myName = new String[] { ... };
从:

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

有关声明的各个章节包括以下内容:

VariableInitializer:
    Expression
    ArrayInitializer
而数组创建表达式()是:

后来:

仅在声明语句中使用大括号进行初始化有什么意义

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
我怀疑它在其他方面简化了语言规范。我同意您应该能够做到这一点-您可能希望编译器能够从变量类型推断数组类型,就像在声明时那样。但请记住,对于大多数语言,右边的表达式类型赋值运算符的nd端不受赋值目标的影响。对于正常语句中的每个表达式类型,在语言术语上,它通常更整洁,可以很好地定义,而不引用同一语句中的其他表达式

用数组创建表达式修复代码是相当容易的,所以我只能接受它

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

class Demo {
    public static void main(String[] args) {
        String[] myName;
            myName = {"AA", "BB", "CC"};
        for(String s: myName) {
            System.out.print(s + " ");
        }
    }
}
因为在Java中这样做基本上是无效的。编译器只是强制执行Java语言规范的规则。您需要指定数组类型:

myName = new String[] { ... };
从:

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

有关声明的各个章节包括以下内容:

VariableInitializer:
    Expression
    ArrayInitializer
而数组创建表达式()是:

后来:

仅在声明语句中使用大括号进行初始化有什么意义

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
我怀疑它在其他方面简化了语言规范。我同意您应该能够做到这一点-您可能希望编译器能够从变量类型推断数组类型,就像在声明时那样。但请记住,对于大多数语言,右边的表达式类型赋值运算符的nd端不受赋值目标的影响。对于正常语句中的每个表达式类型,在语言术语上,它通常更整洁,可以很好地定义,而不引用同一语句中的其他表达式


用数组创建表达式修复代码相当容易,所以我只能接受它。

好问题,我甚至不知道,没有新字符串[]你可以做好问题,我甚至不知道,没有新字符串[]你可以做很好的解释。很好。很好的解释。很好的解释。很好。