1 /*
   2  * Copyright 2002 Sun Microsystems, Inc.  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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
  20  * CA 95054 USA or visit www.sun.com if you need additional information or
  21  * have any questions.
  22  */
  23 
  24 /*
  25  * @test
  26  * @bug 4509267
  27  * @summary generics: parametric exception type versus overriding
  28  * @author gafter
  29  *
  30  * @compile -source 1.5 ParametricException.java
  31  */
  32 
  33 import java.io.*;
  34 
  35 abstract 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 
  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 }
  56 
  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 }
  68 
  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 }
  83 
  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 }