Home | History | Annotate | Download | only in DefaultMethods
      1 /*
      2  * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      7  *
      8  *   - Redistributions of source code must retain the above copyright
      9  *     notice, this list of conditions and the following disclaimer.
     10  *
     11  *   - Redistributions in binary form must reproduce the above copyright
     12  *     notice, this list of conditions and the following disclaimer in the
     13  *     documentation and/or other materials provided with the distribution.
     14  *
     15  *   - Neither the name of Oracle nor the names of its
     16  *     contributors may be used to endorse or promote products derived
     17  *     from this software without specific prior written permission.
     18  *
     19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
     20  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
     21  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
     23  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     24  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     25  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     26  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
     27  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
     28  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     29  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     30  */
     31 
     32 /**
     33  * This sample diamond interface inheritance with <b>default methods</b>.
     34  * If there's not already a unique method implementation to inherit,
     35  * you must provide it. The inheritance diagram is similar to the following:
     36  * <pre>
     37  *                   Animal
     38  *                    /   \
     39  *                 Horse   Bird
     40  *                    \   /
     41  *                   Pegasus
     42  * </pre>
     43  *
     44  * Both {@link Horse} and {@link Bird} interfaces implements the <code>go</code>
     45  * method. The {@link Pegasus} class have to overrides the
     46  * <code>go</code> method.
     47  *
     48  * The new syntax of super-call is used here:
     49  * <pre>
     50  *     &lt;interface_name&gt;.super.&lt;method&gt;(...);
     51  *     For example:  Horse.super.go();
     52  * </pre> So, Pegasus moves like a horse.
     53  */
     54 public class DiamondInheritance {
     55 
     56     /**
     57      * Base interface to illustrate the diamond inheritance.
     58      *
     59      * @see DiamondInheritance
     60      */
     61     public interface Animal {
     62 
     63         /**
     64          * Return string representation of the "go" action for concrete animal
     65          *
     66          * @return string representation of the "go" action for concrete animal
     67          */
     68         String go();
     69     }
     70 
     71     /**
     72      * Interface to illustrate the diamond inheritance.
     73      *
     74      * @see DiamondInheritance
     75      */
     76     public interface Horse extends Animal {
     77 
     78         /**
     79          * Return string representation of the "go" action for horse
     80          *
     81          * @return string representation of the "go" action for horse
     82          */
     83         @Override
     84         default String go() {
     85             return this.getClass().getSimpleName() + " walks on four legs";
     86         }
     87     }
     88 
     89     /**
     90      * Interface to illustrate the diamond inheritance.
     91      *
     92      * @see DiamondInheritance
     93      */
     94     public interface Bird extends Animal {
     95 
     96         /**
     97          * Return string representation of the "go" action for bird
     98          *
     99          * @return string representation of the "go" action for bird
    100          */
    101         @Override
    102         default String go() {
    103             return this.getClass().getSimpleName() + " walks on two legs";
    104         }
    105 
    106         /**
    107          * Return string representation of the "fly" action for bird
    108          *
    109          * @return string representation of the "fly" action for bird
    110          */
    111         default String fly() {
    112             return "I can fly";
    113         }
    114     }
    115 
    116     /**
    117      * Class to illustrate the diamond inheritance. Pegasus must mix horse and
    118      * bird behavior.
    119      *
    120      * @see DiamondInheritance
    121      */
    122     public static class Pegasus implements Horse, Bird {
    123 
    124         /**
    125          * Return string representation of the "go" action for the fictitious
    126          * creature Pegasus
    127          *
    128          * @return string representation of the "go" action for the fictitious
    129          * creature Pegasus
    130          */
    131         @Override
    132         public String go() {
    133             return Horse.super.go();
    134         }
    135     }
    136 
    137     /**
    138      * Illustrate the behavior of the {@link Pegasus} class
    139      *
    140      * @param args command line arguments
    141      */
    142     public static void main(final String[] args) {
    143         System.out.println(new Pegasus().go());
    144     }
    145 }
    146