通过javase api文档阅读,我注意到几乎所有集合框架中的方法都使用尖括号。例如:
Collection<String> c = new HashSet<String>();
或
Map<String, Integer> m = new HashMap<String, Integer>();
在眼睛看来,它们似乎与一组括号具有相同的功能。我仍然不太了解Java语言,因此能够看到使用尖括号的总体连接以及为什么会出现这种情况。
我的问题具体是: JVM解释尖括号的方式对于perens是否有意义?或者它只是跨多种语言的常见做法?
答案 0 :(得分:8)
尖括号附带了Java 1.5中的泛型引入
由于这是对现有语言的后续添加,我猜选择的尖括号与现有括号(方法和构造函数调用),方括号(数组成员访问)和大括号(块分隔符)有明显区别)。我会说尖括号是合乎逻辑的选择。
答案 1 :(得分:3)
尖括号的解释方式是否有意义 JVM与perens相对吗?
它们都没有被JVM解释 [括号和尖括号],括号和尖括号都在编译期间被解析,而JVM看不到它们,因为JVM在运行时处于活动状态。
附注:
<>
用于generics,其用法在其他语言(如C ++)中也很常见。
您指的是new HashSet<String>();
作为方法 - 它不是,它正在调用构造函数。构造函数不是方法。
答案 2 :(得分:3)
括号已经保留用于方法调用和表达式分组。尖括号用于泛型类型参数。
如果两者都使用括号,那么事情可能会变得模棱两可,如果不是编译器,那么至少对于读者而言。
答案 3 :(得分:3)
我猜它们在Java
中使用,因为它们在C++
中使用,就像从int
到void
的所有内容一样。
找到一些有趣的参考资料,虽然是部分的:
来自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;
那是:
bang
,其类型是指向类型参数为foo
的模板类型bar
的指针?foo
,传入bar
,然后将结果乘以bang
?这在语法上是模棱两可的。我们可以调整语法,使它总是更喜欢一个,但这使得(已经很痛苦的复杂)语法更加毛茸茸。更糟糕的是,无论你选择哪种方式,用户有时可能会猜错。
因此,对于C ++,为模板使用不同的分组字符是有意义的。
Java然后只是遵循C ++的脚步。
这里的大多数问题源于C决定不具有变量声明的显式语法,而只是使用类型注释隐式表示“创建该类型的新变量”。像Scala这样的语言具有明确的变量关键字(var
和val
),它们具有更多的类型声明语法自由度,这就是为什么他们可以使用[]
来表示泛型。