Runtime problem with method references
Howard Lovatt
howard.lovatt at gmail.com
Tue Mar 26 20:15:10 PDT 2013
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.
More information about the lambda-dev
mailing list