package com.itant; import java.util.ArrayList; import java.util.List; import com.itant.extend.Controller; import com.itant.gen.DogController; import com.itant.gen.DogController2; import com.itant.gen.GController; import com.itant.gen.GController2; public class Test { public static void main(String[] args) { // TODO Auto-generated method stub // 可以传dog,可以传cat,但是不能使用具体的dog或cat的特殊方法,除非判断类型并显式强转 Controller controller = new Controller(); controller.setAnimal(new Dog()); //无法执行特殊方法,除非显式强转 //gController.getAnimal().run(); ((Dog)controller.getAnimal()).run(); // 使用的时候再确定具体类型,一旦指定,则不能更改。 // 优势:除了指定父类,还可以指定具体的Dog类,使用Dog的特有方法,而不仅仅是基类的方法 GController gController = new GController(); gController.setAnimal(new Dog()); gController.getAnimal().sound(); // 泛型是基类,也需要显式强转 GController gControllerDog = new GController(); gControllerDog.setAnimal(new Dog()); gControllerDog.getAnimal().sound(); gControllerDog.getAnimal().run(); DogController dogController = new DogController(); GController gController2 = dogController; //通过父类设置添加,使用的时候会强转 gController2.setAnimal(new Cat()); // 通过子类设置,只能传具体类型 //dogController.setAnimal(new Dog()); dogController.getAnimal().sound(); DogController2 dogController2 = new DogController2(); GController2 gController3 = dogController2; gController3.setAnimal(new Dog()); dogController2.getAnimal().sound(); } }