JavaSE学习笔记——泛型

  • 泛型在集合中的使用
    1. 集合中不使用泛型时:
       public void test1(){
       //1.在集合中没有使用泛型的时候
         List list = new ArrayList();
         list.add(89);
         list.add(87);
         list.add(67);
         //list.add(new String("AA"));
         //1. 没有使用泛型,任何Object及其子类的对象均可以添加进来
         for(int i = 0; i < list.size(); ++i){
             //2. 强转为int型的时候,可能报ClassCastException异常
             int score = (Integer)list.get(i);
             System.out.println(score);
         }
     }
    
    1. 集合中使用了泛型
    //2. 在集合中使用泛型
        @Test
        public void test2(){
            List<Integer> list = new ArrayList<Integer>();
            list.add(78);
            list.add(58);
            //list.add("AA");
    
            for(int i = 0; i < list.size(); ++i){
                int score = list.get(i);
                System.out.println(score);
            }
            Iterator<Integer> it = list.iterator();
            while(it.hasNext()){
                System.out.println(it.next());
            }
        }
    
  • 如何自定义泛型类、泛型接口、泛型方法
    1. 泛型类的使用
    public class DAO <T>{
        Map<String, T> map = new HashMap<String, T>();
    
        public void delete(String id){
            map.remove(id);
        }
        public List<T> list(){
            List<T> list = new ArrayList<T>();
            for (String s:map.keySet()) {
                list.add(map.get(s));
            }
            return list;
        }
        public void update (String id, T entity){
            map.remove(id);
            map.put(id, entity);
        }
        public  T get(String id){
            return map.get(id);
        }
        public void save(String id, T entity){
            map.put(id, entity);
        }
    }
    
    public class TestDAO {
        public static void main(String[] args) {
            DAO<User> dao = new DAO<User>();
            dao.map = new HashMap<String, User>();
            dao.save("1001", new User(1,32,"梁朝伟"));
            dao.save("1002", new User(2, 34,"汤唯"));
            dao.save("1003", new User(3,23,"刘嘉玲"));
            User u = dao.get("1001");
            System.out.println(u);
            dao.update("1002", new User(4, 15,"成龙"));
            dao.delete("1003");
            List<User> list = dao.list();
            System.out.println(list);
    
        }
    }
    /**
    * 对象实例化时如果不指定泛型,默认为Object
    * 泛型类型不同的引用之间不能相互赋值
    * 加入集合中的对象类型必须和泛型所指定的泛型类型一致
    * 如果泛型类是一个接口或者抽象类,则不可以被实例化
    * 不能在catch中使用泛型
    * 静态方法中不能使用类的泛型
    */
    
    1. 泛型方法的使用
    //实现数组到集合的复制
        public <E> List<E> fromArrayToList(E[] e, List<E> list){
            for(E e1: e){
                list.add(e1);
            }
            return list;
        }
    /**
    * 泛型类中的普通方法不可以加static描述符
    * 泛型类中的泛型方法可以加上static描述符
    */
    
  • 泛型与继承的关系
    1. A类是B类的子类,G是带泛型声明的类或者接口,则G<A>不是G<B>的子类。
    2. 接口中也是同样的道理,泛型引用之间的继承关系,并不会影响到泛型类。
  • 泛型中通配符的使用
    1. A类是B类的子类,G是带泛型声明的类或者接口,则G<?>是G<A>、G<B>的父类!
    2. 对于List<?>,能够读取其中元素,读出来都是Object类型,但是不可以向其中写入任何类型数据。
      因为没有指明可以存放到其中的类型,只有null可以存放进去。
    3. ? extends A:可以存放A及其子类 / ?Super A:可以存放A及其父类
        public void test6(){
            List<?> list = null;
            List<Object> list1 = new ArrayList<Object>();
            List<String> list2 = new ArrayList<String>();
            list = list1;//correct
            list = list2;//correct
    
            List<? extends Number> list3 = null;
            List<Integer> list4 = null;
            List<? super Number> list5 = null;
            list5 = list1;//correct
            list3 = list1;//wrong
        }
    
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容