Wed, 12 Feb 2014 11:16:22 -0800
Added tag jdk8u11-b00 for changeset c9db8c800797
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 */
24 /*
25 * @test
26 * @bug 4509267
27 * @summary generics: parametric exception type versus overriding
28 * @author gafter
29 *
30 * @compile ParametricException.java
31 */
33 import java.io.*;
35 abstract class AChurchBoolean {
36 public abstract <Return, Parameter, Throws extends Throwable>
37 Return accept(IVisitor<Return, Parameter, Throws> visitor, Parameter parameter) throws Throws;
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 }
45 class 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 }
57 class 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 }
69 class 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 }
84 // Perhaps a bit of a toy example, but relevant nonetheless.
85 class 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 }