考虑以下表达式集合:
class T {{
/*1*/ Object o = T.super; // error: '.' expected
/*2*/ o.toString();
}}
试图编译这段代码将在/*1*/
行失败,并显示以下错误信息:
fail
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行)正确地将this
转换为Object
(Eclipse对T.super
的理解),存储在本地变量o
中。当代码被执行时,它正常完成,并且/*2*/
行产生了正确的结果。到目前为止,我没有找到任何与
o = T.super;
相关的内容在Java 8语言规范中,即它是否合法。由于它没有明确说明它是一个合法的表达式,所以我的猜测是它是不合法的。但是,为什么Eclipse认为它是合法的呢?因此我的问题是:根据JLS,
T.super
是一个合法的表达式吗?
toString
被重写,编译后的代码仍应该打印T
实例的toString
。 - samczsunnew ArrayList<>() {{add(something);}}
。虽然这不是一种非常优雅的方式,因为它创建了一个不必要的匿名类,但仍然可以使用。 - Sergei Tachenov