用于java语法的技巧来区分&gt;&gt; (右移运算符)vs嵌套泛型列表<list <string>&gt; </list <string>

时间:2012-09-27 11:50:43

标签: java generics grammar

  

可能重复:
  What trick does Java use to avoid spaces in >>?

C ++ 中,嵌套参数需要额外的空格,所以你会看到如下内容:

List< List<String> >

Java 中,不需要空格,可以这样写:

List<List<String>>

如果您愿意,可以使用额外的空格,但不需要。 (在 C ++ 中,一个问题 之所以出现是因为没有空格的>>表示右移算子。 Java修复了 语法中的技巧问题。)

任何机构都可以解释java语法中用来解决问题的技巧吗?

3 个答案:

答案 0 :(得分:3)

Java语言规范与C ++具有相同的问题

http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.2

  

每个步骤都使用尽可能长的翻译,即使结果最终没有形成正确的程序,而另一个词汇翻译也是如此。

     

因此,输入字符a-b被标记化(§3.5)为a, - ,b,它不是任何语法正确程序的一部分,即使标记化a, - , - ,b可能是其中的一部分一个语法正确的程序。

这意味着>>应该始终被识别为一个标记,而不是每个规范的两个>

这可能是一个(微不足道的)规范错误,因为Java阵营中没有人真正遵循这个错误。

答案 1 :(得分:1)

假设Java使用实际语法,而不是一些手工编码的令牌提取不匹配(一个安全的假设),那是因为解析器试图找到参数化的结束,而不考虑第二个角度支架

这是一种可能的语法(不太可能是使用的实际语法,自从我为任何事情编写语法以来已经好几年了,所以任何想要编辑的人都应该感到自由):

typeref          : classname
                 | classname paramaterization

parameterization : '<' typeref '>'

只有某些地方可以发生typeref:变量/参数声明,强制转换或跟随new运算符。解析器看到开放角度括号,因此知道它正在处理参数化类型。该参数化以结束角度括号结束。

但是,定义是递归的。如果它看到另一个打开角度括号,它知道它在另一个参数化中。但是,内部参数化再次以结束角括号结束。

答案 2 :(得分:0)

我的猜测(这就是我要做的)是Java在解析代码时查找对,例如(),{},[],&lt;&gt;,&gt;&gt;,&lt;&lt;是对。

因此,在解析代码时,如果已经读取了对中的第一个字符,那么它会继续查找该对中的第二个字符,一旦找到该字符,它就会从下一个字符开始处理。

所以当它看到第一个&gt;在List<List<String>>中,它认为它是第二个赞美之词。等等。

我认为C ++也可以做这样的事情,但他们更喜欢这种可读性......:)