aoqi@0: /* aoqi@0: * Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved. aoqi@0: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. aoqi@0: * aoqi@0: * This code is free software; you can redistribute it and/or modify it aoqi@0: * under the terms of the GNU General Public License version 2 only, as aoqi@0: * published by the Free Software Foundation. aoqi@0: * aoqi@0: * This code is distributed in the hope that it will be useful, but WITHOUT aoqi@0: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or aoqi@0: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License aoqi@0: * version 2 for more details (a copy is included in the LICENSE file that aoqi@0: * accompanied this code). aoqi@0: * aoqi@0: * You should have received a copy of the GNU General Public License version aoqi@0: * 2 along with this work; if not, write to the Free Software Foundation, aoqi@0: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. aoqi@0: * aoqi@0: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA aoqi@0: * or visit www.oracle.com if you need additional information or have any aoqi@0: * questions. aoqi@0: */ aoqi@0: aoqi@0: /* aoqi@0: * @test aoqi@0: * @bug 4916607 aoqi@0: * @summary Test casts (legal, warning, and errors) aoqi@0: * @author gafter aoqi@0: * aoqi@0: * @compile -Werror CastTest.java aoqi@0: */ aoqi@0: aoqi@0: import java.util.*; aoqi@0: aoqi@0: class CastTest { aoqi@0: aoqi@0: // --- Directly transferring parameters --- aoqi@0: aoqi@0: private class AA { } aoqi@0: aoqi@0: private class AB extends AA { } aoqi@0: private class AC extends AA> { } aoqi@0: private class AD extends AA> { } aoqi@0: private class AE extends AA> { } aoqi@0: private class AF extends AA { } aoqi@0: private class AG extends AA { } aoqi@0: aoqi@0: private void parameterTransfer() { aoqi@0: Object o; aoqi@0: aoqi@0: o = (AB) (AA) null; // <> aoqi@0: o = (AC) (AA>) null; // <> aoqi@0: aoqi@0: o = (AD) (AA>) null; // <> aoqi@0: o = (AD) (AA>) null; // <> aoqi@0: o = (AD) (AA>) null; // <> aoqi@0: aoqi@0: o = (AE) (AA>) null; // <> aoqi@0: aoqi@0: o = (AF) (AA) null; // <> aoqi@0: aoqi@0: o = (AG) (AA) null; // <> aoqi@0: } aoqi@0: aoqi@0: // --- Inconsistent matches --- aoqi@0: aoqi@0: private class BA { } aoqi@0: private class BB { } aoqi@0: aoqi@0: private class BC extends BA { } aoqi@0: private class BD extends BB { } aoqi@0: aoqi@0: private void inconsistentMatches() { aoqi@0: Object o; aoqi@0: aoqi@0: o = (BC) (BA) null; // <> aoqi@0: o = (BD) (BB) null; // <> aoqi@0: } aoqi@0: aoqi@0: private void whyMustEverythingBeSo_______Complicated() { aoqi@0: // This has to work... aoqi@0: BD bd = new BD(); aoqi@0: BB bb = bd; aoqi@0: aoqi@0: // 4916620: wildcards: legal cast is rejected aoqi@0: // bd = (BD) bb; // <> <> aoqi@0: } aoqi@0: aoqi@0: // --- Transferring parameters via supertypes --- aoqi@0: aoqi@0: private interface CA { } aoqi@0: private interface CB extends CA { } aoqi@0: private interface CC extends CA { } aoqi@0: aoqi@0: private class CD implements CB { } aoqi@0: private interface CE extends CC { } aoqi@0: aoqi@0: private interface CF { } aoqi@0: private interface CG { } aoqi@0: private class CH implements CF, CG { } aoqi@0: private interface CI extends CF { } aoqi@0: private interface CJ extends CG { } aoqi@0: private interface CK extends CI, CJ { } aoqi@0: aoqi@0: private void supertypeParameterTransfer() { aoqi@0: Object o; aoqi@0: o = (CE) (CD) null; // <> aoqi@0: aoqi@0: // 4916622: unnecessary warning with cast aoqi@0: // o = (CH) (CK) null; // <> <> aoqi@0: } aoqi@0: aoqi@0: // --- Disjoint --- aoqi@0: aoqi@0: private interface DA { } aoqi@0: private interface DB extends DA { } aoqi@0: private interface DC extends DA { } aoqi@0: aoqi@0: private void disjointness() { aoqi@0: Object o; aoqi@0: aoqi@0: // Classes aoqi@0: o = (DA) (DA) null; // <> aoqi@0: o = (DA) (DA) null; // <> aoqi@0: o = (DA) (DA) null; // <> aoqi@0: aoqi@0: o = (DA) (DA) null; // <> aoqi@0: aoqi@0: o = (DA) (DA) null; // <> aoqi@0: aoqi@0: o = (DA) (DA) null; // <> aoqi@0: aoqi@0: // Typevars aoqi@0: o = (DA) (DA) null; // <> aoqi@0: aoqi@0: // Raw (asymmetrical!) aoqi@0: o = (DA) (DB) null; // <> aoqi@0: o = (DA) (DB) null; // <> aoqi@0: o = (DA) (DB) null; // <> aoqi@0: aoqi@0: o = (DB) (DA) null; // <> aoqi@0: o = (DB) (DA) null; // <> aoqi@0: o = (DB) (DA) null; // <> aoqi@0: aoqi@0: // reported broken (5034609) aoqi@0: // o = (DC) (DA) null; // <> aoqi@0: } aoqi@0: aoqi@0: }