gpt4 book ai didi

java - 'T.super' 是 JLS 的合法表达吗?

转载 作者:IT老高 更新时间:2023-10-28 21:01:37 26 4
gpt4 key购买 nike

考虑以下一组表达式:

class T {{
/*1*/ Object o = T.super; // error: '.' expected
/*2*/ o.toString();
}}

尝试编译它会在 /*1*/失败并出现错误:

error: '.' expected
o = T.super;
^

同时使用 OpenJDK 1.8.0 (Ubuntu)Oracle JDK 1.8 (Windows)

但是,Eclipse 4.5.0 (Mars) 编译没有任何错误,结果是:

class T {
T();
0 aload_0 [this]
1 invokespecial java.lang.Object() [8] // super()
4 aload_0 [this]
5 astore_1 [o] // o = T.super
7 invokevirtual java.lang.Object.toString() : java.lang.String [10]
10 pop // ^-- o.toString()
11 return
}

由此可以看出java代码的/*1*/行(结果的5行)正确存储了thisObject(Eclipse 对T.super的理解)转换成局部变量o。代码执行时,正常完成,/*2*/ 行产生正确的结果。

到目前为止,我未能在 Java 8 Language Specification 中找到与 o = T.super; 相关的任何内容。 ,即是否合法。由于它没有明确声明它是合法的表达方式,我猜这意味着它是非法。但是,为什么 Eclipse 认为它是合法的呢?因此我的问题是:

T.super 是 JLS 的合法表达吗?


编辑:通过删除包装内部类来简化代码。

最佳答案

不,不是。引用 Chapter 19 .搜索关键字 super 会产生以下结构:

  • 通配符边界:extends T/super T;
  • 显式构造函数调用:super(args);
  • 字段访问:[Typename.]super.field;
  • 方法调用:[Typename.]super.method();
  • 方法引用:super::method.

它编译的事实可能被认为是一个错误或语言扩展,尽管两者之间没有真正的区别。

关于java - 'T.super' 是 JLS 的合法表达吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34661973/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com