Skip to content
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

Closed
wants to merge 1 commit into from
Closed

Default methods #26

wants to merge 1 commit into from

Conversation

Arneball
Copy link
Contributor

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 #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";
}

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:
#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
}

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
}
@luontola
Copy link
Owner

Um... What is this pull request about? Was it even meant to be a pull request?

@luontola
Copy link
Owner

Oh, I got your email. So this is about default methods. I've now renamed it.

@luontola luontola changed the title package testpackage; Default methods Aug 12, 2014
@luontola
Copy link
Owner

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).

@Mart-Bogdan
Copy link

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.

@Arneball
Copy link
Contributor Author

Dont sorry. I am porting the classes to java already

@luontola
Copy link
Owner

Superseded by #30

@luontola luontola closed this Aug 25, 2014
@luontola luontola mentioned this pull request Sep 3, 2014
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants