test/tools/javac/lambda/InnerConstructor.java

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

author
rfield
date
Tue, 14 May 2013 11:11:09 -0700
changeset 1752
c09b7234cded
parent 1415
01c9d4161882
child 2255
b2e4c5ca111f
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

rfield@1405 1 /*
rfield@1405 2 * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
rfield@1405 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
rfield@1405 4 *
rfield@1405 5 * This code is free software; you can redistribute it and/or modify it
rfield@1405 6 * under the terms of the GNU General Public License version 2 only, as
rfield@1405 7 * published by the Free Software Foundation.
rfield@1405 8 *
rfield@1405 9 * This code is distributed in the hope that it will be useful, but WITHOUT
rfield@1405 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
rfield@1405 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
rfield@1405 12 * version 2 for more details (a copy is included in the LICENSE file that
rfield@1405 13 * accompanied this code).
rfield@1405 14 *
rfield@1405 15 * You should have received a copy of the GNU General Public License version
rfield@1405 16 * 2 along with this work; if not, write to the Free Software Foundation,
rfield@1405 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
rfield@1405 18 *
rfield@1405 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
rfield@1405 20 * or visit www.oracle.com if you need additional information or have any
rfield@1405 21 * questions.
rfield@1405 22 */
rfield@1405 23
rfield@1405 24 /*
rfield@1405 25 * @test
mcimadamore@1415 26 * @bug 8003280
mcimadamore@1415 27 * @summary Add lambda tests
mcimadamore@1415 28 * Regression test JDK-8003306 inner class constructor in lambda
rfield@1405 29 * @author Robert Field
rfield@1405 30 */
rfield@1405 31
mcimadamore@1415 32 public class InnerConstructor {
rfield@1405 33
mcimadamore@1415 34 public static void main(String... args) {
mcimadamore@1415 35 InnerConstructor ic = new InnerConstructor();
mcimadamore@1415 36 String res = ic.seq1().m().toString();
mcimadamore@1415 37 if (!res.equals("Cbl.toString")) {
mcimadamore@1415 38 throw new AssertionError(String.format("Unexpected result: %s", res));
mcimadamore@1415 39 }
rfield@1405 40 }
rfield@1405 41
rfield@1405 42 Ib1 seq1() {
rfield@1405 43 return () -> new Cbl();
rfield@1405 44 }
rfield@1405 45
rfield@1405 46 class Cbl {
rfield@1405 47 Cbl() { }
mcimadamore@1415 48 public String toString() {
mcimadamore@1415 49 return "Cbl.toString";
mcimadamore@1415 50 }
rfield@1405 51 }
rfield@1405 52
rfield@1405 53 interface Ib1 {
rfield@1405 54 Object m();
rfield@1405 55 }
rfield@1405 56 }

mercurial