Warum Objekt bar = (Object) foo; muss in einem Block sein, damit der Code kompiliert werden kann?
Weil es zu erklären eine Variable sinnlos ist, wenn das die einzige Anweisung in dem Block ist. Die Deklaration ist bedeutungslos, da Sie in einem nachfolgenden Code nicht auf die Variable verweisen können. (Der Gültigkeitsbereich der Variablen wäre nur die Deklaration.)
Grundsätzlich stoppt der Compiler Sie etwas Sinnloses zu tun.
In Bezug auf die Spezifikation, das ist die Produktion Sie (section 14.9 of the JLS) zu verwenden sind versuchen:
IfThenStatement:
if (Expression) Statement
Nun ist die Erklärung Produktion von section 14.5 definiert ist.
Statement:
StatementWithoutTrailingSubstatement
LabeledStatement
IfThenStatement
IfThenElseStatement
WhileStatement
ForStatement
StatementWithoutTrailingSubstatement:
Block
EmptyStatement
ExpressionStatement
AssertStatement
SwitchStatement
DoStatement
BreakStatement
ContinueStatement
ReturnStatement
SynchronizedStatement
ThrowStatement
TryStatement
StatementNoShortIf:
StatementWithoutTrailingSubstatement
LabeledStatementNoShortIf
IfThenElseStatementNoShortIf
WhileStatementNoShortIf
ForStatementNoShortIf
Beachten Sie, dass dort kein LocalVariableDeclarationStatement vorhanden ist. Das nur tritt in der BlockStatement-Produktion auf, die in section 14.4 der JLS definiert wird.
Wir können nicht präziser sein;) – Mik378