在Java中,为什么map.get(key)[0]作为左侧有效,但map.get(key)不是?

时间:2018-02-07 19:44:13

标签: java dictionary variable-assignment

示例:

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可以分配?

4 个答案:

答案 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 = 3o.f = 3a[4] = 3等内容。

因此,方法调用表达式不能作为赋值表达式的左侧,这就是map.get(key)不可接受的原因。