泛型的通配符的三种应用情况

package com.java.GeneriationDmeo.www;

import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;

//写个动物的父类
class Animal{
 private String name;
 private String Sex;
 

 public Animal() {
  super();
  // TODO Auto-generated constructor stub
 }
 
 public Animal(String name, String sex) {
  super();
  this.name = name;
  Sex = sex;
 }

 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public String getSex() {
  return Sex;
 }
 public void setSex(String sex) {
  Sex = sex;
 }
 @Override
 public String toString() {
  return "Animal [name=" + name + ", Sex=" + Sex + "]";
 }
 
}
//创建狗类继承父类
class Dog extends Animal{
 private String name;
 private String sex;
 

 public Dog() {
  super();
 }

 public Dog(String name, String sex) {
  super(name, sex);
  this.name=name;
  this.sex=sex;
 }
 
 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public String getSex() {
  return sex;
 }

 public void setSex(String sex) {
  this.sex = sex;
 }

 @Override
 public String toString() {
  return "Dog [name=" + name + ", sex=" + sex + "]";
 }
 
}
//创建一个猫类继承父类
class Cat extends Animal{
 private String name;
 private String sex;
 
 public Cat() {
  super();
 }
 public Cat(String name, String sex) {
  super(name, sex);
  this.name=name;
  this.sex=sex;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public String getSex() {
  return sex;
 }
 public void setSex(String sex) {
  this.sex = sex;
 }
 @Override
 public String toString() {
  return "Cat [name=" + name + ", sex=" + sex + "]";
 } 
}

public class GeneriationTest {

 public static void main(String[] args) {
  //创建一个Hashset集合
  HashSet<Dog> set1=new HashSet<Dog>();
  set1.add(new Dog("小黄","雌性"));
  set1.add(new Dog("小黑","雄性"));
  HashSet<Cat> set2=new HashSet<Cat>();
  set2.add(new Cat("心如","雌性"));
  set2.add(new Cat("冰冰","雌性"));
  //迭代器
  printList(set1);
 }
 /**
  * 通用迭代器
  * @param set
  */
 private static void printList(HashSet<? extends Animal> set) {
  for (Iterator<? extends Animal> it = set.iterator(); it.hasNext();) {
   System.out.println(it.next());
   
  }
 }
}
/*
 *
 * 不同的集合类型以及不同的元素类型 在同一个方法中调用的时候,我们可以传入通配符来使方法得到扩展
 * 通配符有三种使用方法
 * 1.<?>不加任何限制的
 * 2<? extends 类型1> 称为上限   可以传入类型1或者类型1的子类
 * 3<? super 类型1>称为下限   可以传入类型1或者类型1的父类
 *
 * /

原文地址:https://www.cnblogs.com/daoxiang1992/p/5738347.html