同样,上面的方式完全是在 Java
编译器中实现的,因此生成的字节码就好像是显式指定了 String
一样。我们通过 javap
查看编译后的字节码。
$ javac *.java
$ javap -c *.class
class Java9AnonymousDiamond {
java.util.concurrent.Callable<java.lang.String> anonymousDiamond();
Code:
0: new #7 // class Java9AnonymousDiamond$1
3: dup
4: aload_0
5: invokespecial #8 // Method Java9AnonymousDiamond$1.“”:(LJava9AnonymousDiamond;)V
8: areturn
}
class Java9AnonymousDiamond$1 implements java.util.concurrent.Callable<java.lang.String> {
final Java9AnonymousDiamond this$0;
Java9AnonymousDiamond$1(Java9AnonymousDiamond);
Code:
0: aload_0
1: aload_1
2: putfield #1 // Field this$0:LJava9AnonymousDiamond;
5: aload_0
6: invokespecial #2 // Method java/lang/Object.“”😦)V
9: return
public java.lang.String call();
Code:
0: ldc #3 // String Hey
2: areturn
}
因为字节码中没有什么特殊的地方,D8
可以毫无问题地处理这个特性。
$ java -jar d8.jar
–lib $ANDROID_HOME/platforms/android-28/android.jar
–release
–output .
*.class
$ ls
Java9AnonymousDiamond.java Java9AnonymousDiamond.class Java9AnonymousDiamond$1.class classes.dex
显然,又一个语言特性 Android
已经可以在所有 API
版本中支持。
1.3 Private Interface Methods
在接口中,static
或 default
方法会由于重写导致重复的实现,如果这些方法是类的一部分而不是接口,则可以提取这些函数为私有函数。在 Java 9
中为接口添加了用 private
修饰的私有方法。
interface Java9PrivateInterface {
static String hey() {
return getHey();
}
private static String getHey() {
return “hey”;
}
}
这是 Java 9
中第一个需要支持的语言功能。在此版本之前,不允许在接口成员上使用 private
。由于 D8
已经通过脱糖处理了 default
和 static
修饰符,private
方法很容易使用相同的技术兼容处理。
$ javac *.java
$ java -jar d8.jar
–lib $ANDROID_HOME/platforms/android-28/android.jar
–release
–output .
*.class
$ ls
Java9PrivateInterface.java Java9PrivateInterface.class classes.dex
在 API 24
的 ART
环境中已经支持 static
和 default
修饰符,当我们指定 --min-api 24