duke@1: /* ohair@554: * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved. duke@1: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. duke@1: * duke@1: * This code is free software; you can redistribute it and/or modify it duke@1: * under the terms of the GNU General Public License version 2 only, as duke@1: * published by the Free Software Foundation. duke@1: * duke@1: * This code is distributed in the hope that it will be useful, but WITHOUT duke@1: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or duke@1: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License duke@1: * version 2 for more details (a copy is included in the LICENSE file that duke@1: * accompanied this code). duke@1: * duke@1: * You should have received a copy of the GNU General Public License version duke@1: * 2 along with this work; if not, write to the Free Software Foundation, duke@1: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. duke@1: * ohair@554: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ohair@554: * or visit www.oracle.com if you need additional information or have any ohair@554: * questions. duke@1: */ duke@1: duke@1: /* duke@1: * @test duke@1: * @bug 4509267 duke@1: * @summary generics: parametric exception type versus overriding duke@1: * @author gafter duke@1: * darcy@289: * @compile ParametricException.java duke@1: */ duke@1: duke@1: import java.io.*; duke@1: duke@1: abstract class AChurchBoolean { duke@1: public abstract duke@1: Return accept(IVisitor visitor, Parameter parameter) throws Throws; duke@1: duke@1: public interface IVisitor { duke@1: public Return caseTrue(Parameter parameter) throws Throws; duke@1: public Return caseFalse(Parameter parameter) throws Throws; duke@1: } duke@1: } duke@1: duke@1: class TrueChurchBoolean extends AChurchBoolean { duke@1: private static TrueChurchBoolean instance = new TrueChurchBoolean(); duke@1: private TrueChurchBoolean() {} duke@1: public static TrueChurchBoolean singleton() { duke@1: return instance; duke@1: } duke@1: public duke@1: Return accept(IVisitor visitor, Parameter parameter) throws Throws { duke@1: return visitor.caseTrue(parameter); duke@1: } duke@1: } duke@1: duke@1: class FalseChurchBoolean extends AChurchBoolean { duke@1: private static FalseChurchBoolean instance = new FalseChurchBoolean(); duke@1: private FalseChurchBoolean() {} duke@1: public static FalseChurchBoolean singleton() { duke@1: return instance; duke@1: } duke@1: public duke@1: Return accept(IVisitor visitor, Parameter parameter) throws Throws { duke@1: return visitor.caseFalse(parameter); duke@1: } duke@1: } duke@1: duke@1: class Pair { duke@1: private T first; duke@1: private U second; duke@1: Pair(T first, U second) { duke@1: this.first = first; duke@1: this.second = second; duke@1: } duke@1: T getFirst() { duke@1: return first; duke@1: } duke@1: U getSecond() { duke@1: return second; duke@1: } duke@1: } duke@1: duke@1: // Perhaps a bit of a toy example, but relevant nonetheless. duke@1: class ChurchBooleanTest { duke@1: private AChurchBoolean bool; duke@1: public ChurchBooleanTest(AChurchBoolean bool) { duke@1: this.bool = bool; duke@1: } duke@1: public AChurchBoolean readIf(File file, byte[] output) throws IOException { duke@1: return bool.accept(new AChurchBoolean.IVisitor, IOException>() { duke@1: public AChurchBoolean caseTrue(Pair parameter) throws IOException { duke@1: FileInputStream input = new FileInputStream(parameter.getFirst()); // throws duke@1: input.read(parameter.getSecond()); // throws duke@1: input.close(); // throws duke@1: return TrueChurchBoolean.singleton(); duke@1: } duke@1: public AChurchBoolean caseFalse(Pair parameter) throws IOException { duke@1: return FalseChurchBoolean.singleton(); duke@1: } duke@1: }, new Pair(file, output)); duke@1: } duke@1: }