changeset 1134:305594037adf

Added methodReference/BridgeMethod.java. Includes workarounds for 7054590, 7028808 and 7067623 Reviewed-by: mcimadamore Contributed-by: Sue Wei <sue.wei@oracle.com>
author jjh
date Mon, 18 Jul 2011 14:39:03 -0700
parents a7e6203a332d
children 655f4ec01337
files test/tools/javac/lambda/sqe/methodReference/BridgeMethod.java
diffstat 1 files changed, 90 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/tools/javac/lambda/sqe/methodReference/BridgeMethod.java	Mon Jul 18 14:39:03 2011 -0700
@@ -0,0 +1,90 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @summary  Test bridge methods in certain SAM conversion
+ * @compile -XDuseProxy BridgeMethod.java
+ * @run main BridgeMethod
+ */
+
+////   -XDuseProxy must be removed after 7054590 is fixed.
+
+import java.lang.reflect.Method;
+
+public class BridgeMethod {
+
+    interface H {Object m();}
+    interface K<T> {void m(T t);}
+
+    interface L extends K<String> {} //generic substitution
+
+    interface M {void m(String s);}
+
+    interface KM extends K<String>, M{} //generic substitution
+
+    interface N extends H {String m();} //covariant return
+
+    private static void assertTrue(boolean cond) {
+        if (!cond)
+            throw new AssertionError();
+    }
+
+    static void bar(String s) {
+        System.out.println("BridgeMethod.bar(String) " + s);
+    }
+
+    String moo() {
+        return "moo";
+    }
+
+    public static void main(String[] args) {
+        L la = BridgeMethod#bar(String); //static reference to bar(String)
+        la.m("hi");
+        Class<? extends L> c1 = la.getClass();
+        Method[] methods = c1.getDeclaredMethods();
+        System.out.println("methods in SAM conversion of L:");
+        for(Method m : methods) //Error: method void m(String) not listed
+            System.out.println(m.toGenericString());
+        //assertTrue( methods.length == 2+3 ); //will be uncommented when the Proxy API problem fixed: CR 7067623
+
+        KM km = BridgeMethod#bar(String);
+        //km.m("hi"); //will be uncommented when CR7028808 fixed
+        Class<? extends KM> c2 = km.getClass();
+        methods = c2.getDeclaredMethods();
+        System.out.println("methods in SAM conversion of KM:");
+        for(Method m : methods)
+            System.out.println(m.toGenericString());
+        assertTrue( methods.length == 2+3 );
+
+        N n = new BridgeMethod()#moo; //instance reference to moo()
+        assertTrue( n.m().equals("moo") );
+        assertTrue( ((H)n).m().equals("moo") );
+        Class<? extends N> c3 = n.getClass();
+        methods = c3.getDeclaredMethods();
+        System.out.println("methods in SAM conversion of N:");
+        for(Method m : methods)
+            System.out.println(m.toGenericString());
+        assertTrue( methods.length == 2+3 );
+    }
+}