Java基础——泛型

在集合中没有使用泛型时:
  1.任何Object及其子类的对象都可以添加进来
  2.从类中取出,强转为某一类型时,可能会有ClassCastException异常
1.在集合中使用泛型:
  格式:List<Integer> list = new ArratList<Integer>();
    注:<>中只能填引用数据类型Integer,不能填入基本数据类型int
    Map<String, Integer> map = new HashMap<String, Integer>();

      或Map<String, Integer> map = new HashMap<>();
    Set<Map.Entry<String, Integer>> set = map.entrySet();
    for(Map.Entry<String, Integer> s: set){

    }

2.自定义泛型类、泛型接口、泛型方法
  public class Order<T>{ 里面涉及到该类型的都用T代替,构造器,get set方法,toString方法都可以有,正常写即可}
  1.使用(实例化泛型类的对象时,指明泛型的类型。指明以后,对应类中使用了泛型的位置,都实例化为指定的泛型的类型)
    Order<Boolean> order = new Order<Boolean>();

  2.当实例化时没有使用,默认是Object型的 Order order = new Order();

  3.继承泛型类或泛型接口时,可以指明泛型的类型
    class SubOrder extends Order<Customer>{ 属性和方法就都是Customer的类型了}
    也可以不指明:
    class SubOrder<T> extends Order<T>{ 属性和方法就都是T的类型}
  4.声明泛型方法:public <E> E getE(E e){ return e;}

public <E> List<E> copyToList(E e, List<E> list){
    for(E e1: e){
        list.add(e1);
    }
    return list;
}    

  5.当通过对象调用泛型方法时,指明泛型方法的类型
    Integer i = order.getE(23);
3.泛型与继承的关系
  A类是B类的子类,但是List<A>不是List<B>的子接口,两者是并列关系

List<Object> list1 = null;
List<String> list2 = new ArrayList<String> ();
list1 = list2;//类型不匹配(不能这样操作)

4.通配符 ?
  A类是B类的子类,G是带泛型声明的类或接口,那么G<?>是G<A>、G<B>的父类

List<?> 是List<A>、List<B>...的父类
List<?> list = null;
List<Object> list1 = new ArrayList<Object> ();
List<String> list2 = new ArrayList<String> ();
list = list1;
list = list2;//这样是可以的

? extends A:可以存放A及A的子类
? super A:可以存放A及其父类

注:不允许向声明为通配符的集合中写入对象,但是可以读取声明为通配符的集合类的对象

Iterator<?> iteraotr = list.iterator();
while(iterator.hasNext()){
    System.out.println(iterator.next());//这里是Object的
}

list.add("aa");是不允许的。
但是可以存null list.add(null);


5.静态方法中不能使用类的泛型。
6.如果泛型类是一个接口或抽象类,则不可创建泛型类的对象。
7.不能在catch中使用泛型
8.从泛型类派生子类,泛型类型需具体化

posted @ 2017-11-09 11:55  SkyeAngel  阅读(256)  评论(0编辑  收藏  举报