Грамматика в главе 18 JLS v7, похоже, отличается от конструкций в другом месте документации, но для меня, похоже, существуют различия. В частности, в главе 15 правила:
RelationalExpression:
ShiftExpression
RelationalExpression < ShiftExpression
RelationalExpression > ShiftExpression
RelationalExpression <= ShiftExpression
RelationalExpression >= ShiftExpression
RelationalExpression instanceof ReferenceType
что делает foo instanceof Bar
выражение RelationalExpression (и, следовательно, EqualityExpresson), которое, в свою очередь, может использоваться как LHS в правиле EqualityExpression, которое делает 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 и в соответствии с моим компилятором.