zoukankan      html  css  js  c++  java
  • 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.从泛型类派生子类,泛型类型需具体化

  • 相关阅读:
    iOS学习-UILabel
    react js
    代理模式
    利用gitbush从git上下载代码到本地
    VS2017企业版密钥
    office2016产品密钥及激活工具
    .netframe初识
    树的遍历——c#实现
    数据结构——总结
    单例模式
  • 原文地址:https://www.cnblogs.com/SkyeAngel/p/7808692.html
Copyright © 2011-2022 走看看