test/tools/javac/lambda/FunctionalInterfaceAnno.java

Tue, 14 May 2013 11:11:09 -0700

author
rfield
date
Tue, 14 May 2013 11:11:09 -0700
changeset 1752
c09b7234cded
parent 0
959103a6100f
permissions
-rw-r--r--

8012556: Implement lambda methods on interfaces as static
8006140: Javac NPE compiling Lambda expression on initialization expression of static field in interface
Summary: Lambdas occurring in static contexts or those not needing instance information should be generated into static methods. This has long been the case for classes. However, as a work-around to the lack of support for statics on interfaces, interface lambda methods have been generated into default methods. For lambdas in interface static contexts (fields and static methods) this causes an NPE in javac because there is no 'this'. MethodHandles now support static methods on interfaces. This changeset allows lambda methods to be generated as static interface methods. An existing bug in Hotspot (8013875) is exposed in a test when the "-esa" flag is used. This test and another test that already exposed this bug have been marked with @ignore.
Reviewed-by: mcimadamore

     1 /*
     2  * @test /nodynamiccopyright/
     3  * @summary smoke test for functional interface annotation
     4  * @compile/fail/ref=FunctionalInterfaceAnno.out -XDrawDiagnostics FunctionalInterfaceAnno.java
     5  */
     6 class FunctionalInterfaceAnno {
     7     @FunctionalInterface
     8     static class A { } //not an interface
    10     @FunctionalInterface
    11     static abstract class B { } //not an interface
    13     @FunctionalInterface
    14     enum C { } //not an interface
    16     @FunctionalInterface
    17     @interface D { } //not an interface
    19     @FunctionalInterface
    20     interface E { } //no abstracts
    22     @FunctionalInterface
    23     interface F { default void m() { } } //no abstracts
    25     @FunctionalInterface
    26     interface G { String toString(); } //no abstracts
    28     @FunctionalInterface
    29     interface H { void m(); void n(); } //incompatible abstracts
    31     @FunctionalInterface
    32     interface I { void m(); } //ok
    33 }

mercurial