1 /* 2 * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 /* 25 * @test 26 * @bug 4881179 4883239 27 * @summary Rule for semantics of ?: in the presence of generics and generic class Class 28 * @author gafter 29 * 30 * @compile Conditional.java 31 */ 32 33 package conditional; 34 35 import java.io.Serializable; 36 37 interface I {} 38 interface J {} 39 class A implements I, J {} 40 class B implements I, J {} 41 class C extends B {} 42 43 class Conditional { 44 static boolean cond = String.class.getName().length() == 1; main(String[] args)45 public static void main(String[] args) { 46 Class c = cond ? A.class : B.class; 47 Class<?> d = cond ? A.class : B.class; 48 49 Class<? extends B> e = cond ? B.class : C.class; 50 } 51 f(A a, B b)52 void f(A a, B b) { 53 I i = cond ? a : b; 54 J j = cond ? a : b; 55 } 56 57 // required for compatibility g(Class a)58 Class g(Class a) { 59 return cond ? a : B.class; 60 } 61 62 // required for compatibility h(byte[] a, byte[] b)63 byte[] h(byte[] a, byte[] b) { 64 return cond ? a : b; 65 } 66 67 // This one is hard because of the recursive F-bounds 68 // The naive result is the infinite type 69 // Class<? extends Number&Comparable<? extends Number&Comparable<? extends 70 // ... 71 Class<? extends Comparable<?>> c = 72 cond ? Integer.class : Float.class; 73 74 Comparable<?> o = 75 cond ? true : 3; 76 77 /* 78 79 // See 4942040 80 void f(Cloneable a, int[] b) { 81 Cloneable x = cond ? a : b; 82 } 83 void f(Serializable a, int[] b) { 84 Serializable x = cond ? a : b; 85 } 86 87 // See 4941882 88 void f(float[] a, int[] b) { 89 Serializable x = cond ? a : b; 90 } 91 */ 92 } 93