lambda in a static method of an interface

Mike Duigou mike.duigou at oracle.com
Mon Apr 1 09:49:35 PDT 2013


Also present in Mercurial tip unless very recently fixed.

Mike

On Apr 1 2013, at 05:04 , Remi Forax wrote:

> This code currently compiles but doesn't work at runtime
> 
> public interface User {
>   public default String firstName() {
>     return transform(0);
>   }
> 
>   public default String lastName() {
>     return transform(1);
>   }
> 
>   public abstract String transform(int index);
> 
>   public static User User(String firstName, String lastName) {
>     return ref -> (ref == 0)? firstName: lastName;
>   }
> 
>   public static void main(String[] args) {
>     User bob = User("Bob", "Vance");
>     System.out.println(bob.firstName());
>     System.out.println(bob.lastName());
>   }
> }
> 
> Exception in thread "main" java.lang.IncompatibleClassChangeError: Class 
> java.lang.String does not implement the requested interface User
>     at User$$Lambda$1.transform(Unknown Source)
>     at User.firstName(User.java:3)
>     at User$$Lambda$1.firstName(Unknown Source)
>     at User.main(User.java:18)
> 
> I believe it's a bug in javac, the desugared method is not declared 
> static but should:
>   public java.lang.String lambda$0(java.lang.String, java.lang.String, 
> int);
> 
> BTW, I use the b83 binary build, not the lastest mecurial tip.
> 
> cheers,
> Rémi
> 
> 
> 



More information about the lambda-dev mailing list