/* * Copyright (c) 2004, 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 * @bug 5061485 * @summary Test sematics of ParameterizedType.equals * @author Joseph D. Darcy */ import java.util.*; import java.lang.reflect.*; public class TestParameterizedType { public <T> T genericMethod0() { return null; } public <T> Set<T> genericMethod1() { return null; } public <T> Set<T> genericMethod2() { return null; } public <S> List<S> genericMethod3() { return null; } public <X, Y> Map<X, Y> genericMethod4() { return null; } public <T> T[] genericMethod5() { return null; } public <T> T[] genericMethod6() { return null; } public Set<? extends Cloneable> genericMethod7() { return null; } public Set<? super Number> genericMethod8() { return null; } public Set<?> genericMethod9() { return null; } static List<Type> createTypes() throws Exception { List<Type> typeList = new ArrayList<Type>(3); String[] methodNames = {"genericMethod0", "genericMethod1", "genericMethod2", "genericMethod3", "genericMethod4", "genericMethod5", "genericMethod6", "genericMethod7", "genericMethod8", "genericMethod9", }; for(String s : methodNames) { Type t = TestParameterizedType.class.getDeclaredMethod(s).getGenericReturnType(); // if (! (t instanceof ParameterizedType)) // throw new RuntimeException("Unexpected kind of return type"); typeList.add(t); } return typeList; } static boolean testReflexes(List<Type> typeList) { for(Type t : typeList) { if (! t.equals(t) ) { System.err.printf("Bad reflexes for%s %s%n", t, t.getClass()); return true; } } return false; } public static void main(String[] argv) throws Exception { boolean failed = false; List<Type> take1 = createTypes(); List<Type> take2 = createTypes(); // Test reflexivity failed = failed | testReflexes(take1); failed = failed | testReflexes(take2); for(int i = 0; i < take1.size(); i++) { Type type1 = take1.get(i); for(int j = 0; j < take2.size(); j++) { Type type2 = take2.get(j); if (i == j) { // corresponding types should be .equals if (!type1.equals(type2) ) { failed = true; System.err.printf("Unexpected inequality: [%d, %d] %n\t%s%n\t%s%n", i, j, type1, type2); } } else { // non-corresponding types should *not* be .equals if (type1.equals(type2) ) { failed = true; System.err.printf("Unexpected equality: [%d, %d] %n\t%s%n\t%s%n", i, j, type1, type2); } } } } if (failed) throw new RuntimeException("Bad equality on ParameterizedTypes"); } }