La grammatica in chapter 18 di JLS v7 sembra differire dai costrutti altrove nella documentazione, ma a me sembrano esserci differenze. In particolare nel capitolo 15 le regole sono:Le grammatiche nelle specifiche Java7 sono davvero equivalenti?
RelationalExpression:
ShiftExpression
RelationalExpression < ShiftExpression
RelationalExpression > ShiftExpression
RelationalExpression <= ShiftExpression
RelationalExpression >= ShiftExpression
RelationalExpression instanceof ReferenceType
che rende foo instanceof Bar
un RelationalExpression (e quindi un EqualityExpresson), che a sua volta può essere utilizzato come LHS nella regola EqualityExpression che rende foo instanceof Bar == false
un EqualityExpression.
Ma quando guardando la grammatica nel capitolo 18 hanno semplificato un po ':
Expression2:
Expression3 [Expression2Rest]
Expression2Rest:
{ InfixOp Expression3 }
instanceof Type
che sembra strano, il che significa che siamo in grado di concatenare Expression3
s con gli operatori binari o siamo in grado di controllare il tipo di di uno Expression3
. Specificamente ora foo instanceof Bar
è un Expression2
, ma non vedo che sarebbe valido utilizzare un Expression2
come LHS di un confronto di uguaglianza.
Ho dimenticato qualcosa nella grammatica del capitolo 18 che rende foo instanceof Bar == false
un'espressione valida? Si noti che è un'espressione valida secondo le regole nel capitolo 15 e secondo il mio compilatore.
Sembra un bug nelle specifiche per me. Si noti che la [sezione equivalente della specifica Java 8] (https://docs.oracle.com/javase/specs/jls/se8/html/jls-19.html) utilizza la stessa grammatica del capitolo 15. –
Perché è un problema che 'foo instanceof Bar == false' è un'espressione valida? L'ho appena controllato e il compilatore lo accetta. – Clashsoft
@Clashsoft Non è un problema, tranne che secondo la grammatica successiva non lo è: 'foo instanceof Bar' è un 'Expression2' e in quello, ma il LHS di' x == y' dovrebbe essere un' Expression3'. A meno che, naturalmente, non mi sia sfuggito qualcosa - che (quello che ho perso) sarebbe stata una risposta alla mia domanda. – skyking