JAVA泛型的应用实例

题目要求:员工类Employee

有:服务员类Waiter 经理类manager  厨师类Cooker继承员工类Employee

要求:

  1.将服务员 厨师 经理放到三个不同的集合中,

  2.定义一个通用方法,将集合当参数传入,遍历集合,并调用各自的工作方法work();

//父类

public abstract class Employee{

  private String name;

  private String id;

  //空参构造器

  public Employee(){}

  //有参构造

  public Employee(String name,String id){

    this.name = name;

    this.id = id;

  }

  //set方法

  public void setName(String name){

    this.name = name;

  }

  public void setId(String id){

    this.id  = id;

  }

  //get方法

  public String getName(){

    return this.name;

  }

  public String getId(){

    return this.id;

  }

  //抽象方法

  public void work();

}

=======================

子类:waiter

public class Waiter extends Employee{

  //构造方法

  public Employee(String name,String id){

    super(name,id); //调用父类的有参构造方法

  }

    //重写父类的抽象方法、

  public void work(){

    System.out.println("服务员在上菜");

  }

}

=======================

子类:cooker

public class Cooker extends Employee{

  //构造器

  public Cooker(String name,String id){

    super(name,id);

  }

  //重写父类抽象方法

  public void work(){

    System.out.println("厨师在做饭");

  }

}

=======================

子类:manager

public class Manager extends Employee{

  //构造器

  public Manager(String name,String id){

    super(name,id);

  }

  //重写父类抽象方法

  public void work(){

    System.out.println("经理在管理");

  }

}

=======================

测试类

public static void main(String[] args){

ArrayList<Cooker> cooker = new ArrayList<Cooker>();

ArrayList<Waiter> waiter = new ArrayList<Waiter>();

ArrayList<Manager> manager = new ArrayList<Manager>();

//添加对象

cooker.add(new Cooker("张三","CK001"));

cooker.add(new Cooker("李四","CK002"));

 

waiter.add(new Waiter("静静","WT001"));

waiter.add(new Waiter("欣欣","WT002"));

 

manager.add(new Manager("王经理","MN001"));

 

//定义方法,集合当成方法的参数传入,在方法中实现各自方法的调用

1. 如果定义为public static void method(ArrayList<Cooker> arr){}, 只能传入Cooker类,其它两个类则不能传入

2. 如果定义为public static void method(ArrayList<Employee> arr){} ,it.next()接收到的是Employee对象,需要强转。如果方法内定义Waiter(it.next());强转成服务员类,则传入厨师类时则会抛异常

3. 如果使用通配符public static void method(ArrayList<?> arr){} ,接收到的是Object对象,同样需要强转,也会抛异常

4. 所以,只能 public static void method(ArrayList<? extends Employee> arr){ }意即,只要是Employee的子类,都可以传入

public static void method(ArrayList<? extends Employee> arr){

  Iterator<Employee ?> it = arr.iterator();

  while(it.hasNext)){

    it.next().work();

  }

}

}

 public static void method(ArrayList<? superEmployee> arr) 限定的是子娄

posted on 2018-06-16 09:33  adamal  阅读(252)  评论(0)    收藏  举报