6487370: javac incorrectly gives ambiguity warning with override-equivalent abstract inherited methods
Summary: Javac should not compare erased return types when checking for ambiguity errors during overload resolution
Reviewed-by: jjg
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java Thu Oct 23 17:59:43 2008 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java Thu Oct 23 18:00:05 2008 +0100
@@ -650,8 +650,9 @@
// both abstract or both concrete
if (!m1Abstract && !m2Abstract)
return new AmbiguityError(m1, m2);
- // check for same erasure
- if (!types.isSameType(m1.erasure(types), m2.erasure(types)))
+ // check that both signatures have the same erasure
+ if (!types.isSameTypes(m1.erasure(types).getParameterTypes(),
+ m2.erasure(types).getParameterTypes()))
return new AmbiguityError(m1, m2);
// both abstract, neither overridden; merge throws clause and result type
Symbol result;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/6487370/T6487370.java Thu Oct 23 18:00:05 2008 +0100
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 6487370
+ * @author Maurizio Cimadamore
+ * @summary javac incorrectly gives ambiguity warning with override-equivalent abstract inherited methods
+ */
+
+public class T6487370 {
+
+ interface I1 {
+ String m(Number n);
+ }
+
+ interface I2 {
+ Object m(Number n);
+ }
+
+ static abstract class X implements I1, I2 {
+ String test() {
+ return m(0.0f);
+ }
+ }
+
+ static class W extends X {
+ public String m(Number n) {
+ return "Hello!";
+ }
+ }
+
+ public static void main(String args[]) {
+ System.out.println(new W().test());
+ }
+}