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
}