当前位置:  开发笔记 > 编程语言 > 正文

根据JLS,'T.super'是一个合法表达吗?

如何解决《根据JLS,'T.super'是一个合法表达吗?》经验,为你挑选了1个好方法。

考虑以下一组表达式:

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
}

从中您可以看到/*1*/java代码行5(结果行)正确地存储thisObject(Eclipse的理解T.super)到局部变量中o.执行代码时,它会正常完成,并且该行/*2*/会生成正确的结果.

到目前为止,我没有找到o = T.super;与Java 8语言规范相关的任何内容,即它是否合法.由于它没有明确说明它是一个法律表达,我的猜测是它意味着它是非法的.但是,为什么Eclipse认为它合法?因此我的问题是:

是否T.super符合JLS的法律表达?


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



1> Sergei Tache..:

不,这不对.请参阅第19章.搜索关键字会super产生以下结构:

通配符边界:extends T/ super T;

显式构造函数调用:super(args);

现场访问:[Typename.]super.field;

方法调用:[Typename.]super.method();

方法参考:super::method.

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


@charlie,第19章是完整的语法.如果它不存在,则它不是有效的语法.如果技术上允许语法,但在其他章节中没有描述,那么我们可以说它没有具体说明.但事实并非如此,它只是一种有效的语言结构.
推荐阅读
殉情放开那只小兔子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有