示例:
Map<Object, String[]> map = new HashMap<Object, String[]>();
Object key = new Object();
map.put(key, new String[2]);
map.get(key)[0] = "test"; // this is valid
map.get(key) = null; // but this is not valid
我理解正确的语法是
map.put(key, null);
所以有2个问题:为什么在[]版本出现时它没有效果,是否有其他标记可以使map.get可以分配?
答案 0 :(得分:1)
由于var request = new XMLHttpRequest();
request.open('GET', 'test_post.php?name=john+doe&age=41', true);
request.onload = function() {
if (request.status >= 200 && request.status < 400) {
// Success!
alert(request.responseText);
} else {
// We reached our target server, but it returned an error
}
};
request.onerror = function() {
// There was a connection error of some sort
};
request.send();
不是有效的分配目标,map.get(key)
无效。其原因与此简单示例相同:
map.get(key) = null
考虑这个不编译的代码:
class Demo {
private String[] array = new String[100];
public String[] getArray() {
return array;
}
}
如果允许编译最后一行,Demo demo = new Demo();
String[] replacement = new String[10];
demo.getArray() = replacement; // This line does not compile
类的用户将有效控制Demo
类中的私有变量array
,即使该类仅暴露了吸气剂。
但是,Demo
是索引运算符的完全有效目标,即可以应用map.get(key)
。
反过来,索引运算符返回赋值的有效目标,因此[0]
有效。
答案 1 :(得分:1)
Java不允许任何表达式位于赋值运算符(=
)的左侧。你需要的不仅仅是一个价值;你需要一些东西来分配右边的东西 - 一个变量。
JLS, Section 15.26进入左侧允许执行此政策的内容:
分配:
LeftHandSide AssignmentOperator Expression
LeftHandSide:
ExpressionName
FieldAccess
了ArrayAccess
单击“ExpressionName”会产生:
ExpressionName:
标识符
AmbiguousName。标识符
AmbiguousName:
标识符
AmbiguousName。标识符
它可以是字段访问表达式,数组访问表达式或标识符。
您的代码map.get(key)[0]
是一个数组访问表达式,因此允许使用,但map.get(key)
不是上述内容(method invocation expression),因此不允许这样做。
答案 2 :(得分:0)
map.get(key)
永远不会被赋值,因为您只能为变量(或使用索引运算符[index]
访问时的数组项)赋值。
map.get(key)[0]
是String something[] = map.get(key); something[0]="test";
的简写(即map.get(key)
返回String
- 数组,您可以应用索引运算符),因此它可以正常工作。
答案 3 :(得分:0)
Java语言规范说,赋值表达式的左侧可以是表达式名称,字段访问表达式或数组访问表达式。表达式名称(大致)是标识符。
然后,您可以撰写i = 3
,o.f = 3
或a[4] = 3
等内容。
因此,方法调用表达式不能作为赋值表达式的左侧,这就是map.get(key)
不可接受的原因。