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();
}