语言设计师为什么使用尖括号而不是括号?

时间:2012-03-16 20:43:51

标签: java language-design

通过javase api文档阅读,我注意到几乎所有集合框架中的方法都使用尖括号。例如:

Collection<String> c = new HashSet<String>();

Map<String, Integer> m = new HashMap<String, Integer>();

在眼睛看来,它们似乎与一组括号具有相同的功能。我仍然不太了解Java语言,因此能够看到使用尖括号的总体连接以及为什么会出现这种情况。

我的问题具体是: JVM解释尖括号的方式对于perens是否有意义?或者它只是跨多种语言的常见做法?

7 个答案:

答案 0 :(得分:8)

尖括号附带了Java 1.5中的泛型引入

由于这是对现有语言的后续添加,我猜选择的尖括号与现有括号(方法和构造函数调用),方括号(数组成员访问)和大括号(块分隔符)有明显区别)。我会说尖括号是合乎逻辑的选择。

答案 1 :(得分:3)

  

尖括号的解释方式是否有意义   JVM与perens相对吗?

它们都没有被JVM解释 [括号和尖括号],括号和尖括号都在编译期间被解析,而JVM看不到它们,因为JVM在运行时处于活动状态。

附注:

  1. <>用于generics,其用法在其他语言(如C ++)中也很常见。

  2. 您指的是new HashSet<String>();作为方法 - 它不是,它正在调用构造函数。构造函数不是方法。

答案 2 :(得分:3)

括号已经保留用于方法调用和表达式分组。尖括号用于泛型类型参数。

如果两者都使用括号,那么事情可能会变得模棱两可,如果不是编译器,那么至少对于读者而言。

答案 3 :(得分:3)

我猜它们在Java中使用,因为它们在C++中使用,就像从intvoid的所有内容一样。

找到一些有趣的参考资料,虽然是部分的:

来自C++ templates: the complete guide By David Vandevoorde, Nicolai M. Josuttis, page 139

  

在模板开发过程中,Tom Pennello-a   广泛认可的解析专家为Metaware工作 - 注意到一些   与尖括号相关的问题。 Stroustrup也评论道   关于[DnE]中的那个主题,并认为人类更喜欢阅读角度   括号而不是括号。但是,存在其他可能性,   和Pennello专门提出了大括号(例如。列出{::X})   1991年的C ++标准会议(在达拉斯举行)当时的   问题的范围更加有限,因为模板嵌套在里面   其他模板 - 所谓的嵌套模板 - 因此无效   第132页第9.3.3节的讨论基本上是无关紧要的。如   结果。委员会拒绝了取代角度的提议   括号中。

所以我可能错误地认为斜角括号用于帮助解析器,也许它们被用来帮助程序员,因为Bjarne Stroustrup认为它们更好。

答案 4 :(得分:0)

在Java中,尖括号表示使用泛型类型,这是一种根据传入的类型具有不同语义的类型。

泛型的最简单用例是在专门的集合中,表明它们应该只包含特定类型的对象。

在Java中,泛型实际上并没有在运行时向语言添加很多内容,除了基本的执行功能。插入到集合中或从集合中检索的对象在运行时自动转换为给定类型(在最坏的情况下冒着ClassCastException的风险)。语言规范中没有对泛型类型进行编译时检查。

答案 5 :(得分:0)

尖括号用于表示多态(“通用”)类和方法的类型参数列表。这些是与值参数列表(括号中的内容)非常不同的野兽。如果它们是相同的,那么想象你有表达式new Foo(bar) ...解析器如何解释这个? bar是类型的名称还是变量的名称?

答案 6 :(得分:-1)

想象一下,C ++使用()而不是<>来表示模板。现在考虑这行代码:

foo(bar)*bang;

那是:

  1. 声明一个局部变量bang,其类型是指向类型参数为foo的模板类型bar的指针?
  2. 调用函数foo,传入bar,然后将结果乘以bang
  3. 这在语法上是模棱两可的。我们可以调整语法,使它总是更喜欢一个,但这使得(已经很痛苦的复杂)语法更加毛茸茸。更糟糕的是,无论你选择哪种方式,用户有时可能会猜错。

    因此,对于C ++,为模板使用不同的分组字符是有意义的。

    Java然后只是遵循C ++的脚步。

    这里的大多数问题源于C决定不具有变量声明的显式语法,而只是使用类型注释隐式表示“创建该类型的新变量”。像Scala这样的语言具有明确的变量关键字(varval),它们具有更多的类型声明语法自由度,这就是为什么他们可以使用[]来表示泛型。