ababup1192
2/23/2017 - 3:45 PM

Animal.java

public interface Walkable {
    void walk();
}
public interface Flyable {
    void fly();
}
public class Dog extends Animal implements Walkable {

    public Dog(String name){
        super(name);
    }

    public void walk(){
        System.out.println(name + " walk");
    }

    // abstract class ではないので、必ず実装をしなければならない。
    public void cry(){
        System.out.println("bow-wow");
    }
}
public class Cat extends Animal implements Walkable {

    public Cat(String name){
        super("name");
    }


    public void walk(){
        System.out.println(name + " walk");
    }


    public void cry(){
        System.out.println("mew");
    }
}
public class Bird extends Animal implements Flyable {

    public Bird(String name){
        super("name");
    }

    // 鳥は歩かない飛ぶのである。(ホントは歩くけど)
    public void fly(){
        System.out.println(name + "fly");
    }

    public void cry(){
        System.out.println("PiyoPiyo");
    }
}
import java.util.stream.Stream;

public class AnimalSimulator {

    public static void main(String args[]){
            // Stream<Animal>
            Stream.of(new Dog("John"), new Cat("Mike"), new Dog("Pochi"), new Bird("Piyo")).
            forEach(animal -> {
                // Animal型は、cryのみ保証する。
                animal.cry();
                // さっきと打って変わってコンパイルエラーになる。試してみるよよい。
                // animal.walk();
            });

            // 実は、結構難しい型 
            // Stream<? extends Walkable & Animal> という型
            Stream.of(new Dog("John"), new Cat("Mike"), new Dog("Pochi")).
            forEach(animal -> {
                // Walker型なので、walkを保証する。 かつ Animalなのでcryも保証する。
                animal.cry();
                animal.walk();
            });
    }
}
public abstract class Animal {
    public final String name;

    public Animal(String name){
        this.name = name;
    }

    // よく考えたら、全てのアニマルがwalkできるとは限らない。
    /*
    public void walk(){
        System.out.println(name + " walk.");
    }
    */

    // アニマル共通の鳴き声は存在しない。
    // (アニマルというのは、抽象的なもの定義に過ぎず実態を持たない。)
    public abstract void cry();

}