为什么Java数组声明要使用花括号?

8
我想知道为什么Java数组声明使用花括号而不是标准的圆括号,就像这里展示的一样。我想象这可能需要更深入地理解花括号的一般用法,但是现在特别关注的是这个问题。
Object[] tableHeaders = {"Cars","Trucks","Tacos"};

这是正确的,相反地。
Object[] tableHeaders = ("Cars","Trucks","Tacos");

如果你在寻找James Gosling的官方证明,我想你可能会失望。这更或多或少是数学界的标准。我认为这个问题没有一个明确的答案。 - Mike Yockey
@yock - 大括号如何成为“数学世界的标准”?在通常的数学符号中,大括号表示(无序)集合,而(有序)序列则用圆括号括起来。 - Ted Hopp
1
我也好奇为什么数组不像 Object[] ar=["Cars", "Trucks", "Tacos"]; 这样声明。对于你回答的第一部分"为什么?",是为了吸引那些有"C"编程背景的人最初进行开发。我相信詹姆斯·高斯林就是其中之一。你可以省略对花括号的进一步理解,因为编译器基于状态解析语言。 - samarjit samanta
只是从维基百科获取灵感。http://en.wikipedia.org/wiki/Set_(mathematics) - Mike Yockey
3个回答

13

花括号通常表示集合和组合,而圆括号通常表示C语言中的参数。

很久以前,人们习惯于在C语言中使用这种约定。我相信这种方式在Java中也是如此,以保持与旧语言的某种语法一致性。


1
是的,这正是用于数组初始化的C语法:char const * tableHeaders[] = {"Cars","Trucks","Tacos"}; 我相信这比任何其他原因更为重要。 - rlibby
它肯定受到了C的启发。但是数组是序列(顺序很重要),而不是集合或组合。在大多数数学符号系统中,序列通常由括号括起来。 - Ted Hopp

8

我无法说为什么James Gosling等人选择了这个特定的替代方案...

但是,使用小括号而不是花括号会为Java语法创建严重的歧义问题。考虑以下示例:

Object[] tableHeaders = ("Cars");

这个圆括号是表示数组构造函数,还是普通表达式语法的一部分?

现在可以想出一些复杂的优先级规则来解决这个问题,但这会让程序员和编译器编写者的生活变得更加困难。

(在语法层面上,Java解析器需要处理以下歧义情况:

VariableInitializer:
    ArrayInitializer
    Expression

在上面的例子中,("Cars")匹配ArrayInitializer和Expression生产...如果您在数组初始化器中使用圆括号,则需要确定正确的含义,这需要查看声明的变量类型...然后进行上下文敏感解析VariableInitializer。很难处理。)

我认为他们没有在数组初始化器中使用圆括号是做出了正确的选择。


方括号也不起作用。考虑尝试解释这个...

... = new Object[]["Cars"];  // 1-D array

对比
... = new Object[21][];      // 2-D array

对比

... = new Object[][];        // is that 1-D or 2-D?

1
在大多数基于Algol的编程语言中,这些是最常用的语言,使用花括号声明数组。

1
你的意思是在大多数Algol风格的语言中是这样的。但在Perl、Fortran、Cobol、Lisp等语言中不是这样的。 - Ted Hopp

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