小编cha*_*lie的帖子

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

考虑以下一组表达式:

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 eclipse super jls java-8

19
推荐指数
1
解决办法
232
查看次数

为什么'T.super.toString()'和'super :: toString'使用合成访问器方法?

考虑以下一组表达式:

class T {{
/*1*/   super.toString();      // direct
/*2*/   T.super.toString();    // synthetic
        Supplier<?> s;
/*3*/   s = super::toString;   // synthetic
/*4*/   s = T.super::toString; // synthetic
}}
Run Code Online (Sandbox Code Playgroud)

这给出了以下结果:

class T {
    T();
     0  aload_0 [this]
     1  invokespecial java.lang.Object() [8]
     4  aload_0 [this]
     5  invokespecial java.lang.Object.toString() : java.lang.String [10]
     8  pop           // ^-- direct
     9  aload_0 [this]
    10  invokestatic T.access$0(T) : java.lang.String [14]
    13  pop           // ^-- synthetic
    14  aload_0 [this]
    15  invokedynamic 0 get(T) : java.util.function.Supplier [21]
    20  astore_1 [s] …
Run Code Online (Sandbox Code Playgroud)

java super java-8 synthetic method-reference

13
推荐指数
1
解决办法
563
查看次数

标签 统计

java ×2

java-8 ×2

super ×2

eclipse ×1

jls ×1

method-reference ×1

synthetic ×1