-
Notifications
You must be signed in to change notification settings - Fork 227
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Default methods #26
Default methods #26
Conversation
public interface MyInterface { default String def() { return "[" + toString() + ", " + "def]"; } default String join(MyInterface other) { return def() + other.def(); } } class C implements MyInterface{} compiles to: public class testpackage.MyClass implements testpackage.MyInterface { public testpackage.MyClass(); Code: 0: aload_0 1: invokespecial luontola#16 // Method java/lang/Object."<init>":()V 4: return public java.lang.String join(testpackage.MyInterface); Code: 0: aload_0 1: aload_1 2: invokestatic luontola#46 // Method testpackage/MyInterfacehelper.join:(Ltestpackage/MyInterface;Ltestpackage/MyInterface;)Ljava/lang/String; 5: areturn public java.lang.String def(); Code: 0: aload_0 1: invokestatic luontola#49 // Method testpackage/MyInterfacehelper.def:(Ltestpackage/MyInterface;)Ljava/lang/String; 4: areturn } Where testpackage.MyInterfacehelper is compiled to public class testpackage.MyInterfacehelper { private testpackage.MyInterfacehelper(); Code: 0: aload_0 1: invokespecial luontola#9 // Method java/lang/Object."<init>":()V 4: return public static java.lang.String def(testpackage.MyInterface); Code: 0: new luontola#13 // class java/lang/StringBuilder 3: dup 4: invokespecial luontola#14 // Method java/lang/StringBuilder."<init>":()V 7: ldc luontola#16 // String [ 9: invokevirtual luontola#20 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 12: aload_0 13: invokevirtual luontola#24 // Method java/lang/Object.toString:()Ljava/lang/String; 16: invokevirtual luontola#20 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 19: ldc luontola#26 // String , 21: invokevirtual luontola#20 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 24: ldc luontola#28 // String def] 26: invokevirtual luontola#20 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 29: invokevirtual luontola#29 // Method java/lang/StringBuilder.toString:()Ljava/lang/String; 32: areturn public static java.lang.String join(testpackage.MyInterface, testpackage.MyInterface); Code: 0: new luontola#13 // class java/lang/StringBuilder 3: dup 4: invokespecial luontola#14 // Method java/lang/StringBuilder."<init>":()V 7: aload_0 8: invokeinterface luontola#35, 1 // InterfaceMethod testpackage/MyInterface.def:()Ljava/lang/String; 13: invokevirtual luontola#20 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 16: aload_1 17: invokeinterface luontola#35, 1 // InterfaceMethod testpackage/MyInterface.def:()Ljava/lang/String; 22: invokevirtual luontola#20 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 25: invokevirtual luontola#29 // Method java/lang/StringBuilder.toString:()Ljava/lang/String; 28: areturn } ============== interface StaticTest { static <T> T staticMethod(T t) { return t; } } compiles to public class testpackage.StaticTesthelper { private testpackage.StaticTesthelper(); Code: 0: aload_0 1: invokespecial luontola#9 // Method java/lang/Object."<init>":()V 4: return public static <T> T staticMethod$static(T); Code: 0: aload_0 1: areturn } ======== Brigde methods are generated properly in example: public interface BridgeParent<T> { T get(); } public interface StringBridges extends BridgeParent<String> { @OverRide default String get() { return "default method"; } default String concrete() { return "concrete"; } } public class testpackage.StringBridgeshelper SourceFile: "testpackage/StringBridges.java" minor version: 0 major version: 50 flags: ACC_PUBLIC, ACC_SUPER Constant pool: luontola#1 = Utf8 testpackage/StringBridgeshelper luontola#2 = Class luontola#1 // testpackage/StringBridgeshelper luontola#3 = Utf8 java/lang/Object luontola#4 = Class luontola#3 // java/lang/Object luontola#5 = Utf8 testpackage/StringBridges.java luontola#6 = Utf8 <init> luontola#7 = Utf8 ()V luontola#8 = NameAndType luontola#6:luontola#7 // "<init>":()V luontola#9 = Methodref luontola#4.luontola#8 // java/lang/Object."<init>":()V luontola#10 = Utf8 get luontola#11 = Utf8 (Ltestpackage/StringBridges;)Ljava/lang/String; luontola#12 = Utf8 default method luontola#13 = String luontola#12 // default method luontola#14 = Utf8 concrete luontola#15 = String luontola#14 // concrete luontola#16 = Utf8 (Ltestpackage/StringBridges;)Ljava/lang/Object; luontola#17 = Utf8 testpackage/StringBridges luontola#18 = Class luontola#17 // testpackage/StringBridges luontola#19 = Utf8 ()Ljava/lang/String; luontola#20 = NameAndType luontola#10:luontola#19 // get:()Ljava/lang/String; luontola#21 = InterfaceMethodref luontola#18.luontola#20 // testpackage/StringBridges.get:()Ljava/lang/String; luontola#22 = Utf8 Code luontola#23 = Utf8 LineNumberTable luontola#24 = Utf8 SourceFile { private testpackage.StringBridgeshelper(); descriptor: ()V flags: ACC_PRIVATE Code: stack=1, locals=1, args_size=1 0: aload_0 1: invokespecial luontola#9 // Method java/lang/Object."<init>":()V 4: return public static java.lang.String get(testpackage.StringBridges); descriptor: (Ltestpackage/StringBridges;)Ljava/lang/String; flags: ACC_PUBLIC, ACC_STATIC Code: stack=1, locals=1, args_size=1 0: ldc luontola#13 // String default method 2: areturn LineNumberTable: line 9: 0 public static java.lang.String concrete(testpackage.StringBridges); descriptor: (Ltestpackage/StringBridges;)Ljava/lang/String; flags: ACC_PUBLIC, ACC_STATIC Code: stack=1, locals=1, args_size=1 0: ldc luontola#15 // String concrete 2: areturn LineNumberTable: line 13: 0 public static java.lang.Object get(testpackage.StringBridges); descriptor: (Ltestpackage/StringBridges;)Ljava/lang/Object; flags: ACC_PUBLIC, ACC_STATIC, ACC_BRIDGE, ACC_SYNTHETIC Code: stack=1, locals=1, args_size=1 0: aload_0 1: invokeinterface luontola#21, 1 // InterfaceMethod testpackage/StringBridges.get:()Ljava/lang/String; 6: areturn LineNumberTable: line 6: 0 }
Um... What is this pull request about? Was it even meant to be a pull request? |
Oh, I got your email. So this is about default methods. I've now renamed it. |
A feature like this requires thorough automated tests, which it currently does not have. Also the dependency to Scala is undesirable: it may cause conflicts with projects that use a different version of Scala, and it makes the program slower to start up (due to class loading overhead). |
It's seems Scala dependency is required only for retrolambda process itself, not at runtime. I think this can cause some problems, if we implement standard interface with default methods. |
Dont sorry. I am porting the classes to java already |
Superseded by #30 |
public interface MyInterface {
default String def() {
return "[" + toString() + ", " + "def]";
}
}
class C implements MyInterface{} compiles to:
public class testpackage.MyClass implements testpackage.MyInterface {
public testpackage.MyClass();
Code:
0: aload_0
1: invokespecial #16 // Method java/lang/Object."":()V
4: return
public java.lang.String join(testpackage.MyInterface);
Code:
0: aload_0
1: aload_1
2: invokestatic #46 // Method testpackage/MyInterfacehelper.join:(Ltestpackage/MyInterface;Ltestpackage/MyInterface;)Ljava/lang/String;
5: areturn
public java.lang.String def();
Code:
0: aload_0
1: invokestatic #49 // Method testpackage/MyInterfacehelper.def:(Ltestpackage/MyInterface;)Ljava/lang/String;
4: areturn
}
Where testpackage.MyInterfacehelper is compiled to
public class testpackage.MyInterfacehelper {
private testpackage.MyInterfacehelper();
Code:
0: aload_0
1: invokespecial #9 // Method java/lang/Object."":()V
4: return
public static java.lang.String def(testpackage.MyInterface);
Code:
0: new #13 // class java/lang/StringBuilder
3: dup
4: invokespecial #14 // Method java/lang/StringBuilder."":()V
7: ldc #16 // String [
9: invokevirtual #20 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
12: aload_0
13: invokevirtual #24 // Method java/lang/Object.toString:()Ljava/lang/String;
16: invokevirtual #20 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
19: ldc #26 // String ,
21: invokevirtual #20 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
24: ldc #28 // String def]
26: invokevirtual #20 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
29: invokevirtual #29 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
32: areturn
public static java.lang.String join(testpackage.MyInterface, testpackage.MyInterface);
Code:
0: new #13 // class java/lang/StringBuilder
3: dup
4: invokespecial #14 // Method java/lang/StringBuilder."":()V
7: aload_0
8: invokeinterface #35, 1 // InterfaceMethod testpackage/MyInterface.def:()Ljava/lang/String;
13: invokevirtual #20 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
16: aload_1
17: invokeinterface #35, 1 // InterfaceMethod testpackage/MyInterface.def:()Ljava/lang/String;
22: invokevirtual #20 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
25: invokevirtual #29 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
28: areturn
}
interface StaticTest {
static T staticMethod(T t) {
return t;
}
}
compiles to
public class testpackage.StaticTesthelper {
private testpackage.StaticTesthelper();
Code:
0: aload_0
1: invokespecial #9 // Method java/lang/Object."":()V
4: return
public static T staticMethod$static(T);
Code:
0: aload_0
1: areturn
}
Brigde methods are generated properly in example:
public interface BridgeParent {
T get();
}
public interface StringBridges extends BridgeParent {
@OverRide
default String get() {
return "default method";
}
}
public class testpackage.StringBridgeshelper
SourceFile: "testpackage/StringBridges.java"
minor version: 0
major version: 50
flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
#1 = Utf8 testpackage/StringBridgeshelper
#2 = Class #1 // testpackage/StringBridgeshelper
#3 = Utf8 java/lang/Object
#4 = Class #3 // java/lang/Object
#5 = Utf8 testpackage/StringBridges.java
#6 = Utf8
#7 = Utf8 ()V
#8 = NameAndType #6:#7 // "":()V
#9 = Methodref #4.#8 // java/lang/Object."":()V
#10 = Utf8 get
#11 = Utf8 (Ltestpackage/StringBridges;)Ljava/lang/String;
#12 = Utf8 default method
#13 = String #12 // default method
#14 = Utf8 concrete
#15 = String #14 // concrete
#16 = Utf8 (Ltestpackage/StringBridges;)Ljava/lang/Object;
#17 = Utf8 testpackage/StringBridges
#18 = Class #17 // testpackage/StringBridges
#19 = Utf8 ()Ljava/lang/String;
#20 = NameAndType #10:#19 // get:()Ljava/lang/String;
#21 = InterfaceMethodref #18.#20 // testpackage/StringBridges.get:()Ljava/lang/String;
#22 = Utf8 Code
#23 = Utf8 LineNumberTable
#24 = Utf8 SourceFile
{
private testpackage.StringBridgeshelper();
descriptor: ()V
flags: ACC_PRIVATE
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokespecial #9 // Method java/lang/Object."":()V
4: return
public static java.lang.String get(testpackage.StringBridges);
descriptor: (Ltestpackage/StringBridges;)Ljava/lang/String;
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=1, locals=1, args_size=1
0: ldc #13 // String default method
2: areturn
LineNumberTable:
line 9: 0
public static java.lang.String concrete(testpackage.StringBridges);
descriptor: (Ltestpackage/StringBridges;)Ljava/lang/String;
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=1, locals=1, args_size=1
0: ldc #15 // String concrete
2: areturn
LineNumberTable:
line 13: 0
public static java.lang.Object get(testpackage.StringBridges);
descriptor: (Ltestpackage/StringBridges;)Ljava/lang/Object;
flags: ACC_PUBLIC, ACC_STATIC, ACC_BRIDGE, ACC_SYNTHETIC
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokeinterface #21, 1 // InterfaceMethod testpackage/StringBridges.get:()Ljava/lang/String;
6: areturn
LineNumberTable:
line 6: 0
}