java - 为什么调用静态方法时用括号包裹类型是非法的?

标签 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");
    }
}

最佳答案

通常在 Java 等语言中,表达式可以自由地放在括号中并保持相同的表达式。但并非一切都是表达。 (裸)类型名是不是表达式的事物之一。它可以是多种表达式的一部分 - 但单独而言,它并不是一个完整的表达式。

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

关于java - 为什么调用静态方法时用括号包裹类型是非法的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26546292/

相关文章:

syntax - VHDL - ror 和 rol 操作

asynchronous - 无法使用 `impl Future` 将异步函数存储在向量中

java - 避免数据库命中

java - 如何在我的应用程序中实现 Google 语音输入?

java - 在 struts2 中,是否可以将可选的 patternMapping 与变量一起使用?

bash - while循环语法错误文件意外结束

java - Spring Security - 终端双重身份验证 : X. 509,用户登录表单

Python "raise from"用法

c# - 如何获取操作系统名称

javascript - FlowJS 内联柯里化(Currying)函数类型与 Union