• java泛型中的通配符


    今天在看ArrayList原码是看到这样的一个符号,好奇怪。
    ?表示通配符,表示的意思是匹配E或E的子类,具体类型未知。

    1.限定通配符

    编写一个类似于ArrayList的动态数据

    public class Gys<T> {
        private final  static int default_capacity =10;
        private int endIndex =0;
        private Object[] elemts;
    
        public Gys() {
            this.elemts = new Object[default_capacity];
        }
    
        public void add(T t){
            if(elemts.length-1< endIndex){
                int newCapcti= default_capacity *2;
                elemts= Arrays.copyOf(elemts,newCapcti);
            }
            elemts[endIndex++]=t;
        }
    
        public void addAll(Gys<T> cs){
           for(int i=0;i<cs.size();i++){
               add(cs.get(i));
            }
        }
    
        public int size(){
            return endIndex;
        }
    
        public T get(int i){
            if(i< endIndex){
                return (T) elemts[i];
            }
            throw new RuntimeException("索引超出界限");
        }
    
    
        public static void main(String[] args) {
            Gys<Number> gys=new Gys<>();
            gys.add(25);
            Gys<Integer> gys2=new Gys<>();
            gys2.add(2);
            gys.addAll(gys2);
        }
    }

     

    修改上面的代码,将addAll参数改成如下

     public void addAll(Gys<? extend T> cs){
           for(int i=0;i<cs.size();i++){
               add(cs.get(i));
            }
    }

    这个时候代码编译通过了。并且能够正常的访问其中的元素。

    2.无限定通配符。

    改写上面的addAll方法代码。

     public void addAll(Gys<?> cs){
           for(int i=0;i<cs.size();i++){
               add(cs.get(i));
            }
        }

    上面的代码编译不通过。?表示类型不确定,从安全角度考虑无限定的泛型,无法进行写操作。
    但是可以这样使用。

    /**
         *判断元素是否存在
         */
        public boolean isHas(Gys<?> gys,Object elemt){
           for(int i=0;i<gys.size();i++){
               if(gys.get(i).equals(elemt)){
                   return  true;
               }
           }
           return false;
       }

       除了<? extend E>用法;还有<? super E>的用法,表示类型是E或E的父类。不过多介绍了,用的少。

  • 相关阅读:
    7-4
    7-3
    第五章例5-2
    第五章例5-1
    第四章例4-12
    第四章例4-11
    第四章例4-10
    第四章例4-9
    第四章例4-8
    第四章例4-7
  • 原文地址:https://www.cnblogs.com/guoyansi19900907/p/12142234.html
Copyright © 2020-2023  润新知