Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/src/share/sample/lambda/DefaultMethods/DiamondInheritance.java
38829 views
/*1* Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.2*3* Redistribution and use in source and binary forms, with or without4* modification, are permitted provided that the following conditions5* are met:6*7* - Redistributions of source code must retain the above copyright8* notice, this list of conditions and the following disclaimer.9*10* - Redistributions in binary form must reproduce the above copyright11* notice, this list of conditions and the following disclaimer in the12* documentation and/or other materials provided with the distribution.13*14* - Neither the name of Oracle nor the names of its15* contributors may be used to endorse or promote products derived16* from this software without specific prior written permission.17*18* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS19* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,20* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR21* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR22* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,23* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,24* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR25* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF26* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING27* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS28* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.29*/3031/**32* This sample diamond interface inheritance with <b>default methods</b>.33* If there's not already a unique method implementation to inherit,34* you must provide it. The inheritance diagram is similar to the following:35* <pre>36* Animal37* / \38* Horse Bird39* \ /40* Pegasus41* </pre>42*43* Both {@link Horse} and {@link Bird} interfaces implements the <code>go</code>44* method. The {@link Pegasus} class have to overrides the45* <code>go</code> method.46*47* The new syntax of super-call is used here:48* <pre>49* <interface_name>.super.<method>(...);50* For example: Horse.super.go();51* </pre> So, Pegasus moves like a horse.52*/53public class DiamondInheritance {5455/**56* Base interface to illustrate the diamond inheritance.57*58* @see DiamondInheritance59*/60public interface Animal {6162/**63* Return string representation of the "go" action for concrete animal64*65* @return string representation of the "go" action for concrete animal66*/67String go();68}6970/**71* Interface to illustrate the diamond inheritance.72*73* @see DiamondInheritance74*/75public interface Horse extends Animal {7677/**78* Return string representation of the "go" action for horse79*80* @return string representation of the "go" action for horse81*/82@Override83default String go() {84return this.getClass().getSimpleName() + " walks on four legs";85}86}8788/**89* Interface to illustrate the diamond inheritance.90*91* @see DiamondInheritance92*/93public interface Bird extends Animal {9495/**96* Return string representation of the "go" action for bird97*98* @return string representation of the "go" action for bird99*/100@Override101default String go() {102return this.getClass().getSimpleName() + " walks on two legs";103}104105/**106* Return string representation of the "fly" action for bird107*108* @return string representation of the "fly" action for bird109*/110default String fly() {111return "I can fly";112}113}114115/**116* Class to illustrate the diamond inheritance. Pegasus must mix horse and117* bird behavior.118*119* @see DiamondInheritance120*/121public static class Pegasus implements Horse, Bird {122123/**124* Return string representation of the "go" action for the fictitious125* creature Pegasus126*127* @return string representation of the "go" action for the fictitious128* creature Pegasus129*/130@Override131public String go() {132return Horse.super.go();133}134}135136/**137* Illustrate the behavior of the {@link Pegasus} class138*139* @param args command line arguments140*/141public static void main(final String[] args) {142System.out.println(new Pegasus().go());143}144}145146147