泛型

来源:互联网 发布:淘宝友情链接有什么用 编辑:程序博客网 时间:2024/06/10 03:13

泛型跟继承的关系

import java.util.ArrayList;import java.util.Iterator;import java.util.List;import org.junit.Test;public class TestGeneric {    /**     * 泛型与继承的关系:      * 若类A是类B的子类,那么List<A>就不是List<B>的子接口      */    @Test    public void test1() {        Object obj = null;        String str = new String("AA");        obj = str;//向上转型          Object[] obj1 = null;        String[] str1 = new String[]{"AAA","BBB"};        obj1 = str1;//向上转型          List<Object> lo = null;        List<String> ls = new ArrayList<String>();        //lo = ls;//错误,List<String>不是List<Object>的子接口      }    /*      * 通配符 ?      * List<A>、List<B>、。。。。都是List<?>的子类      *       * ? extends A :可以存放A及其子类      * ? super A:可以存放A及其父类      */    @Test    public void test2() {        List<?> list = null;        List<Object> lo = new ArrayList<Object>();        List<String> ls = new ArrayList<String>();        list = lo;        list = ls;        show1(lo);        List<? extends Number> ln = null;        List<Integer> lin = new ArrayList<Integer>();        ln = lin;        List<Object> lob = new ArrayList<Object>();        //ln = lob;//错误,? extends A :可以存放A及其子类          List<? super Number> ln2 = null;        ln2 = lob;        //ln2 = lin;//错误,? super A:可以存放A及其父类      }    public <T> void show1(List<T/*此处T相当于传进来的类型*/> list) {    }    public void show2(List<?/*此处?相当于传进来的类型的父接口类型*/> list) {    }    @Test    public void test3() {        List<String> ls = new ArrayList<String>();        ls.add("aa");        ls.add("bb");        ls.add("cc");        List<?> li = ls;        //可以读取声明为通配符的集合对象          Iterator it = li.iterator();        while(it.hasNext()) {            Object o = it.next();            System.out.println(o);        }        //不能写进声明为通配符的集合对象,除了唯一例外的null          //li.add("dd");//错误          //li.add(12);//错误          li.add(null);        List<String> lstr = (List<String>)li;//强转回原来的类型就可以写进          lstr.add("ll");        System.out.println(lstr);    }}  
通配符
T有类型 ?无类型
public class AnimalTrainer {public void act(List<? extends Animal> list) {for (Animal animal : list) {animal.eat();}}}


public class TestAnimal {public static void main(String[] args) {AnimalTrainer animalTrainer = new AnimalTrainer();//Test 1List<Animal> animalList = new ArrayList<>();animalList.add(new Cat("cat1"));animalList.add(new Bird("bird1"));animalTrainer.act(animalList);//可以通过编译//Test 2List<Cat> catList = new ArrayList<>();catList.add(new Cat("cat2"));catList.add(new Cat("cat3"));animalTrainer.act(catList);//也可以通过编译}}

原创粉丝点击