I've just take a look to bug 8047341 [1] and I think it's a javac bug and not a bug in the lambda meta-factory, moreover, Eclipse generates a code which doesn't throw an exception at runtime.

In list.stream().forEach(TestString::new), TestString::new reference the constructor of TestString which is an inner class (non static) of FooBase, so the constructor takes a hidden FooBase parameter
so the method reference should refer to TestString(FooBase, String).

The code generated by javac is:
  14: aload_0
15: invokedynamic #5, 0 // InvokeDynamic #0:accept:(LFoo;)Ljava/util/function/Consumer; 20: invokeinterface #6, 2 // InterfaceMethod java/util/stream/Stream.forEach:(Ljava/util/function/Consumer;)V

while Eclipse ecj generates:
  14: aload_0
15: invokedynamic #27, 0 // InvokeDynamic #0:accept:(LFooBase;)Ljava/util/function/Consumer; 20: invokeinterface #28, 2 // InterfaceMethod java/util/stream/Stream.forEach:(Ljava/util/function/Consumer;)V

as you can see, javac generate an invokedynamic call with a Foo instead of a FooBase which I think is the correct behavior.

So for me, it's a bug in javac, not in the meta-factory.

cheers,
RĂ©mi

[1] https://bugs.openjdk.java.net/browse/JDK-8047341


Reply via email to