受到another question的启发,我开始怀疑以下Java代码的定义是否正确:
public class Test {
List<Object> foo;
Object bar() {
foo = new ArrayList<Object>():
return(/* Anything */);
}
void frob() {
foo.add(bar());
}
}
在这种情况下,Java规范是否为frob
中的点运算符指定了严格的评估顺序?是否保证从左到右的评估,以便add
方法始终在bar
用新列表替换字段之前的列表上执行,或者合法地允许编译器允许bar
方法。 1}}在foo
中提取frob
字段之前执行,从而在新列表上执行add
方法?
我怀疑从左到右的评估是有保证的,但是说明书中是否有这样的措辞呢?
答案 0 :(得分:1)
是的,这是Run-time Evaluation of Method Invocation - Compute Target Reference
的一部分如果表格涉及
Primary . [TypeArguments] Identifier
,则:
如果调用模式是静态的,则没有目标引用。将评估Primary表达式,但结果是 丢弃。
否则,评估
Primary
表达式,并将结果用作目标参考。