当前位置 主页 > 网站技术 > 代码类 >

    java泛型常用通配符实例解析

    栏目:代码类 时间:2020-01-03 15:07

    这篇文章主要介绍了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的父类。不过多介绍了,用的少。

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持IIS7站长之家。