这个问题是关于好奇心,而不是实际问题。有人可以解释为什么以下代码会导致编译时错误吗?
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");
}
}
答案 0 :(得分:2)
在纯粹使用(Long)而没有对象左值的情况下进行投射。这就是为什么
当你使用时。 Java中的运算符需要使用左值:
Long myVal = new Long(30);
myVal.someMethod(args);
阅读Java Numbers here的子类。您还必须了解点.
运算符如何为函数和变量工作。我认为一旦你把这些事情弄清楚,你会发现它更容易。
答案 1 :(得分:2)
通常在像Java这样的语言中,表达式可以自由地放在括号中并保持相同的表达式。但并非一切都是表达。 (裸)typename是不是表达式的东西之一。它可以是多种表达方式的一部分 - 但仅此一点,它不是一个完整的表达式。
由于这个事实,正如在评论中所说的那样,解析器尝试将带括号的typename解析为转换表达式的一部分(具体地,“类型”部分(Long)
)。但是,其余代码无法解析为有效的强制转换表达式(因为它必须后跟一个有效的表达式,它将产生一个您没有的转换对象,因为.parseLong("1")
不是一个有效的表达式),所以整个事情都被拒绝了。