test/tools/javac/generics/ParametricException.java

Thu, 31 Aug 2017 15:17:03 +0800

author
aoqi
date
Thu, 31 Aug 2017 15:17:03 +0800
changeset 2525
2eb010b6cb22
parent 554
9d9f26857129
parent 0
959103a6100f
permissions
-rw-r--r--

merge

     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 }

mercurial