这个问题是出于好奇,而不是实际问题。有人可以解释为什么以下代码会导致编译时错误吗?
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");
}
}
最佳答案
通常在 Java 等语言中,表达式可以自由地放在括号中并保持相同的表达式。但并非一切都是表达。 (裸)类型名是不是表达式的事物之一。它可以是多种表达式的一部分 - 但单独而言,它并不是一个完整的表达式。
由于这个事实,正如评论中所述,解析器尝试将带括号的类型名解析为强制转换表达式的一部分(具体来说,“类型”部分 (Long)
)。但是,代码的其余部分无法解析为有效的转换表达式(因为它后面必须跟一个有效的表达式,该表达式将产生转换的对象 - 您没有,因为 .parseLong("1 ")
不是一个有效的表达式),所以整个事情都会被拒绝。
关于java - 为什么调用静态方法时用括号包裹类型是非法的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26546292/