cha*_*lie 19 java eclipse super jls java-8
考虑以下一组表达式:
class T {{
/*1*/ Object o = T.super; // error: '.' expected
/*2*/ o.toString();
}}
Run Code Online (Sandbox Code Playgroud)
尝试编译这将失败的行/*1*/出现错误:
error: '.' expected
o = T.super;
^
Run Code Online (Sandbox Code Playgroud)
使用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
}
Run Code Online (Sandbox Code Playgroud)
从中您可以看到/*1*/java代码行5(结果行)正确地存储this为Object(Eclipse的理解T.super)到局部变量中o.执行代码时,它会正常完成,并且该行/*2*/会生成正确的结果.
到目前为止,我没有找到o = T.super;与Java 8语言规范相关的任何内容,即它是否合法.由于它没有明确说明它是一个法律表达,我的猜测是它意味着它是非法的.但是,为什么Eclipse认为它合法?因此我的问题是:
T.super符合JLS的法律表达?Ser*_*nov 13
不,这不对.请参阅第19章.搜索关键字会super产生以下结构:
extends T/ super T;super(args);[Typename.]super.field;[Typename.]super.method();super::method.它编译的事实可能被认为是一个错误或语言扩展,尽管两者之间没有真正的区别.
| 归档时间: |
|
| 查看次数: |
232 次 |
| 最近记录: |