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          */
go()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
go()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
go()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          */
fly()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
go()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      */
main(final String[] args)142     public static void main(final String[] args) {
143         System.out.println(new Pegasus().go());
144     }
145 }
146