Invoking a default method can cause IllegalAccessError
Stephan Herrmann
stephan.herrmann at berlin.de
Mon Apr 1 16:48:18 PDT 2013
Thanks for the link.
You mean, when Eclipse generates code that runs on a current VM
(e.g. b81), that's actually "wrong"? :)
Asked differently: where would I learn which bridge methods
will indeed be needed on a correctly implemented VM?
Stephan
On 04/02/2013 01:09 AM, Dan Smith wrote:
> This is a known bug:
> http://bugs.sun.com/view_bug.do?bug_id=8009130
>
> It's actually the VM, not javac, that is generating the faulty invokespecial call...
>
> —Dan
>
> On Mar 31, 2013, at 7:36 AM, Stephan Herrmann <stephan.herrmann at berlin.de> wrote:
>
>> Compile these 2 files using
>> 1.8.0-ea-lambda-nightly-h3673-20130312-b81-b00:
>>
>> ----8<--- p2/J.java ---8<----
>>
>> package p2;
>> interface I {
>> public default void foo() {
>> System.out.println("default");
>> }
>> }
>> public interface J extends I {}
>>
>> ----8<--- p1/C.java ---8<----
>>
>> package p1;
>> public class C implements p2.J {
>> public static void main(String[] args) {
>> C c = new C();
>> c.foo();
>> }
>> }
>>
>> ----8<-----
>>
>> Running p1.C yields:
>>
>> Exception in thread "main" java.lang.IllegalAccessError: tried to access
>> class p2.I from class p1.C
>> at p1.C.foo(C.java)
>> at p1.C.main(C.java:5)
>>
>> Obviously javac forgot to generate a synthetic super access
>> into J (not expecting that interfaces ever need such, but ..)
>>
>> cheers,
>> Stephan
>>
>
More information about the lambda-dev
mailing list