JLS v7 chapter 18中的语法似乎与文档中其他地方的结构不同,但对我来说似乎存在差异。特别是在第15章中,规则是:
RelationalExpression:
ShiftExpression
RelationalExpression < ShiftExpression
RelationalExpression > ShiftExpression
RelationalExpression <= ShiftExpression
RelationalExpression >= ShiftExpression
RelationalExpression instanceof ReferenceType
使foo instanceof Bar
成为一个RelationalExpression(因此也就是EqualityExpresson),它又可以在EqualityExpression规则中用作LHS,使foo instanceof Bar == false
成为EqualityExpression。
但是当看到第18章的语法时,他们已经简化了一点:
Expression2:
Expression3 [Expression2Rest]
Expression2Rest:
{ InfixOp Expression3 }
instanceof Type
这看起来很奇怪,这意味着我们可以将Expression3
与二元运算符链接在一起,或者我们可以检查一个Expression3
的类型。具体来说,现在foo instanceof Bar
是Expression2
,但我不认为使用Expression2
作为平等比较的LHS是有效的。
我是否遗漏了第18章的语法,使foo instanceof Bar == false
成为一个有效的表达式?请注意,根据第15章中的规则并根据我的编译器,它是一个有效的表达式。
答案 0 :(得分:2)
这个问题应该得到一个很好的答案,所以让我们仔细看看。
完全基于第18章的语法:
任何带有 InfixOp 的内容(例如==
)都适合 Expression2Rest 或什么都不适合。并且 Expression2Rest 仅属于 Expression2 。因此,如果foo instanceof Bar == false
是合法的Java,那意味着foo instanceof Bar
必须是 Expression3 。
Expression2:
Expression3 [Expression2Rest]Expression2Rest:
{InfixOp Expression3}
instanceof 输入
但foo instanceof Bar
不是 Expression3 。没有 PrefixOp 且没有强制转换,因此要成为 Expression3 ,它必须是主要。但它不合适。
表达式3:
PrefixOp Expression3
( (表达式 | 类型) ) Expression3
主要{选择器} {PostfixOp}
初级:
立即
ParExpression
此 [参数]
超级 SuperSuffix
新 创作者
NonWildcardTypeArguments(ExplicitGenericInvocationSuffix | this 参数)
标识符{。 标识符} [IdentifierSuffix]
BasicType { [] } * .class
的 void.class 强>
结论:仅基于第18章中提供的语法,foo instanceof Bar == false
不是合法的Java表达式。 !?!?!
当然那是胡说八道。 foo instanceof Bar
产生一个布尔结果,该结果肯定可以与false
进行比较。表达式编译并运行。
更好的结论:第18章不具有权威性,但本书的其余部分是。
第2.3节说明
第4章,第6-10,14和第15章给出了Java编程语言的语法语法。第18章还给出了Java编程语言的语法语法,更好适合实施而不是博览会。
根据第15章中提出的语法规则,foo instanceof Bar == false
是一个合法的Java表达式。但请查看第15.20.1节之前的最后一句:&#34;关系表达式的类型总是布尔。&#34;这与15.20中的 RelationalExpression 规则本身直接冲突。 (特别是,它意味着instanceof
的LHS必须评估为布尔。)它可能不是真的。
Bestest结论:这本书有问题。如果你想知道某些东西是否是合法的Java,你必须编译并运行它,最好是在Oracle的参考实现上。即便如此,也可能存在错误。毕竟,这只是软件。
我认为,如果他们稍微改变了 Expression2 规则,那么第18章可能是正确的。像这样:
*表达式2:
Expression3 [ instanceof 类型]
Expression2 {InfixOp Expression3}
但谁知道,这可能会导致其他问题。无论如何,它已在Java 8中修复。