Runtime problem with method references

Howard Lovatt howard.lovatt at gmail.com
Tue Mar 26 23:27:01 PDT 2013


Thanks. I will try the latest build, but the java.net download site seems
to be down at the moment (reporting a 20 h download time for the JDK dmg as
I write).


On 27 March 2013 15:44, Brian Goetz <brian.goetz at oracle.com> wrote:

> I believe this is already fixed; have you tried with a more recent build?
>
> On Mar 26, 2013, at 8:15 PM, Howard Lovatt wrote:
>
> > Hi,
> >
> > On my Mac running:
> >
> > openjdk version "1.8.0-ea"
> > OpenJDK Runtime Environment (build
> > 1.8.0-ea-lambda-nightly-h3500-20130225-b79-b00)
> > OpenJDK 64-Bit Server VM (build 25.0-b19, mixed mode)
> >
> > The following gives the runtime error below.
> >
> > /**
> > * Bug in method references, doesn't work at runtime. Relevant part of
> > error message is:
> > * <pre>
> > * Caused by: java.lang.IllegalAccessException: member is private:
> > rhjod.stream.BugInMethodReferences.twice(double)double/invokeStatic, from
> > rhjod.stream.BugInMethodReferences$Calls$2
> > * at java.lang.invoke.MemberName.makeAccessException(MemberName.java:732)
> > * at
> >
> java.lang.invoke.MethodHandles$Lookup.checkAccess(MethodHandles.java:1135)
> > * at
> >
> java.lang.invoke.MethodHandles$Lookup.checkMethod(MethodHandles.java:1098)
> > * at
> >
> java.lang.invoke.MethodHandles$Lookup.getDirectMethodCommon(MethodHandles.java:1209)
> > * at
> >
> java.lang.invoke.MethodHandles$Lookup.getDirectMethod(MethodHandles.java:1199)
> > * at
> >
> java.lang.invoke.MethodHandles$Lookup.linkMethodHandleConstant(MethodHandles.java:1265)
> > * </pre>
> > *
> > * @author Howard Lovatt
> > */
> > public final class BugInMethodReferences {
> >  private static double twice(final double in) { return 2 * in; }
> >
> >  @FunctionalInterface interface MethodDD { double call(double in); }
> >
> >  private static enum Calls {
> >    Lambda {
> >      @Override MethodDD get() { return (in) -> twice(in); }
> >    },
> >    Reference {
> >      @Override MethodDD get() { return BugInMethodReferences::twice; }
> >    };
> >    abstract MethodDD get();
> >  }
> >
> >  /**
> >   * @param notUsed the command line arguments
> >   */
> >  public static void main(final String... notUsed) {
> >    final double in = 42 / 2;
> >    System.out.println(Calls.Lambda + ": " + Calls.Lambda.get().call(in));
> > // OK
> >    System.out.println(Calls.Reference + ": " +
> > Calls.Reference.get().call(in)); // Crash!!!
> >  }
> > }
> >
> >
> >  -- Howard.
> >
>
>


-- 
  -- Howard.


More information about the lambda-dev mailing list