泛型的限定

package cn.itcast.api.a.generic;
import java.util.ArrayList;
    import java.util.Collection;
    import java.util.HashSet;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Set;

import cn.itcast.domain.Person;
import cn.itcast.domain.Student;
import cn.itcast.domain.Worker;
public class GenericDemo_泛型的限定5 {



        public static void main(String[] args) {
            // TODO Auto-generated method stub


//          List<Student> list = new ArrayList<Student>();
            Set<Student> list = new HashSet<Student>();
//          1
            list.add(new Student("lisisi1",20));
            list.add(new Student("lisisi2",21));
            list.add(new Student("lisisi3",22));
            PrintList(list);

//          2   
            List<Worker> list2 = new ArrayList<Worker>();
            list2.add(new Worker("lisisi11",20));
            list2.add(new Worker("lisisi21",21));
            list2.add(new Worker("lisisi31",22));
            //将学生取出来
            PrintList(list2);

        }
    //打印集合中的元素,发现当list变成set集合时,封装之后的打印方法不能使用
//      那么有没有既可以使用与List又能使用与Set集合呢?操作其父类Collection
//      当你不能保证传入的数据类型是什么时,可以使用通配符‘?’,这是一个实际参数

/*
 * 如果想对打印的集合中的元素进行限制,只在指定的一些类型进行打印
 * 那么就需要使用泛型的限定  有两个类型  Student Worker
 * 那么只需要找到其父类型 Person
 * 通配符 extends 父类型
 * 
 * ? extends Person :接受Person类型或者Person的子类型
 *? super E  :接受E类型或者E的父类型  下限
 *? extends E  :接受E类型或者E的子类型  上限
 *
 *
 *使用泛型要保证左右泛型一致
 * **/      
        public static void PrintList(Collection</*Student*//*?*/? extends Person> list2) {
            for (Iterator</*Student*//*?*/? extends Person> it = list2.iterator(); it.hasNext();) {//封装迭代器  选中--右键--refactor--extract method
                /*Student student =it.next();*/
                Person p = it.next();
                System.out.println(/*student*//*it.next()*/p);
            }
        }   
    }

猜你喜欢

转载自blog.csdn.net/mingxu_W/article/details/82594061