泛型限定

package 泛型;
/* ? 通配符,也可以理解为占位符
 * 泛型的限定:
 *      1、 ? extends E: 可以接收E类型或者E的子类型。 上限限定
 *         2、? super E:可以接收E类型或者E的父类型。 下限限定
 *
 *
 * */
import java.util.ArrayList;
import java.util.Iterator;

public class GenericDemo3 {
    public static void main(String[] args) {
        ArrayList<String> al = new ArrayList<String>();
        al.add("abc1");
        al.add("abc2");
        al.add("abc3");
        al.add("abc4");
        
        ArrayList<Integer> al1 = new ArrayList<Integer>();
        al1.add(2);
        al1.add(4);
        al1.add(6);
        
        printColl(al);
        printColl(al1);
        
        //下面用了泛型限定
        ArrayList<Person> al2 = new ArrayList<Person>();
        al2.add(new Person("a"));
        al2.add(new Person("a1"));
        al2.add(new Person("a2"));
        printColl3(al2);
        ArrayList<Student> al3 = new ArrayList<Student>();
        al3.add(new Student("b"));
        al3.add(new Student("b2"));
        al3.add(new Student("b3"));
        printColl3(al3);
    }
    //把迭代器封装 传泛型方法一:
    public static  void printColl(ArrayList<?> al){//?占位符
        Iterator<?> it = al.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }
    }
    //把迭代器封装 传泛型方法二:
        public static <T> void printColl1(ArrayList<T> al){//?占位符
            Iterator<T> it = al.iterator();
            while(it.hasNext()){
                T t = it.next();//T代可传入一种类型,可以操作对象。?代表不明确具体类型
                                //可传入各种类型。除了基本类型
                System.out.println(it.next());
            }
        }

        //把迭代器封装 传泛型方法三:泛型限定
            public static void printColl3(ArrayList<? extends Person> al){//?占位符
                Iterator<? extends Person> it = al.iterator();
                while(it.hasNext()){
                    //T t = it.next();//T代可传入一种类型,可以操作对象。?代表不明确具体类型
                                    //可传入各种类型。除了基本类型
                    System.out.println(it.next());
                }
            }

}

//上限限定的两个类
class Person{
    private String name;

    
    public Person(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
class Student extends Person{//继承父类Person

    public Student(String name) {
        super(name);
        // TODO 自动生成的构造函数存根
    }
}

//下限限定的类案例


posted @ 2016-05-02 00:03  宫学良  阅读(280)  评论(0编辑  收藏  举报