1/*
2 * Copyright (c) 2002, 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 4509267
27 * @summary generics: parametric exception type versus overriding
28 * @author gafter
29 *
30 * @compile  ParametricException.java
31 */
32
33import java.io.*;
34
35abstract class AChurchBoolean {
36    public abstract <Return, Parameter, Throws extends Throwable>
37    Return accept(IVisitor<Return, Parameter, Throws> visitor, Parameter parameter) throws Throws;
38
39    public interface IVisitor<Return, Parameter, Throws extends Throwable> {
40        public Return caseTrue(Parameter parameter) throws Throws;
41        public Return caseFalse(Parameter parameter) throws Throws;
42    }
43}
44
45class TrueChurchBoolean extends AChurchBoolean {
46    private static TrueChurchBoolean instance = new TrueChurchBoolean();
47    private TrueChurchBoolean() {}
48    public static TrueChurchBoolean singleton() {
49        return instance;
50    }
51    public <Return, Parameter, Throws extends Throwable>
52    Return accept(IVisitor<Return, Parameter, Throws> visitor, Parameter parameter) throws Throws {
53        return visitor.caseTrue(parameter);
54    }
55}
56
57class FalseChurchBoolean extends AChurchBoolean {
58    private static FalseChurchBoolean instance = new FalseChurchBoolean();
59    private FalseChurchBoolean() {}
60    public static FalseChurchBoolean singleton() {
61        return instance;
62    }
63    public <Return, Parameter, Throws extends Throwable>
64    Return accept(IVisitor<Return, Parameter, Throws> visitor, Parameter parameter) throws Throws {
65        return visitor.caseFalse(parameter);
66    }
67}
68
69class Pair<T,U> {
70    private T first;
71    private U second;
72    Pair(T first, U second) {
73        this.first = first;
74        this.second = second;
75    }
76    T getFirst() {
77        return first;
78    }
79    U getSecond() {
80        return second;
81    }
82}
83
84// Perhaps a bit of a toy example, but relevant nonetheless.
85class ChurchBooleanTest {
86    private AChurchBoolean bool;
87    public ChurchBooleanTest(AChurchBoolean bool) {
88        this.bool = bool;
89    }
90    public AChurchBoolean readIf(File file, byte[] output) throws IOException {
91        return bool.accept(new AChurchBoolean.IVisitor<AChurchBoolean, Pair<File, byte[]>, IOException>() {
92            public AChurchBoolean caseTrue(Pair<File, byte[]> parameter) throws IOException {
93                FileInputStream input = new FileInputStream(parameter.getFirst()); // throws
94                input.read(parameter.getSecond()); // throws
95                input.close(); // throws
96                return TrueChurchBoolean.singleton();
97            }
98            public AChurchBoolean caseFalse(Pair<File, byte[]> parameter) throws IOException {
99                return FalseChurchBoolean.singleton();
100            }
101        }, new Pair<File, byte[]>(file, output));
102    }
103}
104