这个问题值得一个很好的答案,所以让我们仔细看看。
仅基于第 18 章中的语法:
任何带有InfixOp (e.g. ==
) 要么适合表达2休息或者什么都不适合。和表达2休息只属于里面表达式2。因此,如果foo instanceof Bar == false
是合法的 Java,这意味着foo instanceof Bar
必须是一个表达式3.
表达式2:
表达式3 [表达式2休息]
表达式2休息:
{InfixOp 表达式3}
实例化 Type
But foo instanceof Bar
不是一个表达式3。没有PrefixOp并且没有演员阵容,所以成为表达式3它必须是一个Primary。但它就是不适合。
表达式3:
前缀运算表达式3
( (表达 | Type) ) 表达式3
主要 { 选择器 } { PostfixOp }
Primary:
Literal
Par表达式
this [论点]
super 超级后缀
new Creator
NonWildcardTypeArguments(显式通用调用后缀) | this
参数)
标识符{ . 标识符 } [标识符后缀]
基本类型{ [] }* .class
无效类
结论:仅基于第 18 章中介绍的语法,foo instanceof Bar == false
不是合法的 Java 表达式。 !?!?!
当然这是废话。foo instanceof Bar
产生一个布尔结果,并且该结果当然可以与false
。表达式编译并运行。
更好的结论:第 18 章并不具有权威性,但本书的其余部分具有权威性。
第 2.3 节指出
A 句法语法第 4、6-10、14 和 15 章给出了 Java 编程语言的语法。...第 18 章还给出了 Java 编程语言的句法语法,它更适合于实现而不是阐述。
根据第 15 章中介绍的语法规则,foo instanceof Bar == false
is合法的 Java 表达式。但请查看第 15.20.1 节之前的最后一句:“关系表达式的类型始终是boolean”这直接与关系表达式15.20 中自行规定。 (特别是,它意味着 LHSinstanceof
必须评估为boolean.) 这不可能是真的。
最佳结论:这本书有问题。如果你想知道某个东西是否是合法的 Java,你必须编译并运行它,最好是在 Oracle 的参考实现上。即使那样也可能存在错误。毕竟,它只是软件。
我认为如果他们改变表达式2规则一点点,第18章可能是对的。就像这样:
*表达式2:
表达式3 [ 实例化 Type ]
表达式2 {InfixOp 表达式3}
但谁知道呢,这可能会导致其他问题。无论如何,它在 Java 8 中得到了修复。