Java 语法中用于区分>>(右移运算符)与嵌套泛型 List<List 的技巧<String>>



可能的重复项:
Java 使用什么技巧来避免>>中的空格?

在C++中,嵌套参数需要额外的空格,因此您会看到如下所示的内容:

List< List<String> >

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

List<List<String>>

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

任何人都可以解释一下java语法中用来解决问题的技巧是什么?

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阵营中没有人真正遵循它。

假设Java使用实际的语法,而不是一些手动编码的标记提取不匹配(一个安全的假设),这是因为解析器试图找到参数化的结尾,并且它不考虑第二个尖括号。

这是一个可能的语法(不太可能是实际使用的语法,而且我已经很多年没有为任何东西编写语法了,所以任何想要编辑的人都应该随意):

typeref          : classname
                 | classname paramaterization
parameterization : '<' typeref '>'

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

但是,该定义是递归的。如果它看到另一个左尖括号,它就知道它在另一个参数化中。但是,该内部参数化同样以单个右尖括号结束。

我的猜测(这就是我会做的)是 Java 在解析代码时寻找对,例如 ()、{}、[]、<>、>>、<<是成对。

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

因此,当它看到List<List<String>>中的第一个>时,它会认为它是第二个<的赞美,依此类推。>

我想C++也可以做这样的事情,但他们更喜欢可读性而不是这个...... :)

最新更新