为什么在调用静态方法时用括号包装类型是非法的?

时间:2014-10-24 10:37:57

标签: java syntax types

这个问题是关于好奇心,而不是实际问题。有人可以解释为什么以下代码会导致编译时错误吗?

public class Test {
    public static void main(String... args) {
        (Long).parseLong("1"); // won't compile
    }
}

错误:

Test.java:3: error: illegal start of type
                (Long).parseLong("1");
                ^
1 error

对于一个实例,有一个括号是合法的(虽然这里也没有必要):

public class Test {
    public static void main(String... args) {
        Long aLong = 1L;
        (aLong).parseLong("1");
    }
}

这当然也是合法的:

public class Test {
    public static void main(String... args) {
        Long.parseLong("1");
    }
}

2 个答案:

答案 0 :(得分:2)

在纯粹使用(Long)而没有对象左值的情况下进行投射。这就是为什么

当你使用时。 Java中的运算符需要使用左值:

Long myVal = new Long(30);
myVal.someMethod(args);

阅读Java Numbers here的子类。您还必须了解点.运算符如何为函数和变量工作。我认为一旦你把这些事情弄清楚,你会发现它更容易。

答案 1 :(得分:2)

通常在像Java这样的语言中,表达式可以自由地放在括号中并保持相同的表达式。但并非一切都是表达。 (裸)typename是不是表达式的东西之一。它可以是多种表达方式的一部分 - 但仅此一点,它不是一个完整的表达式。

由于这个事实,正如在评论中所说的那样,解析器尝试将带括号的typename解析为转换表达式的一部分(具体地,“类型”部分(Long))。但是,其余代码无法解析为有效的强制转换表达式(因为它必须后跟一个有效的表达式,它将产生一个您没有的转换对象,因为.parseLong("1")不是一个有效的表达式),所以整个事情都被拒绝了。