java泛型中的通配符

2020-01-02 16:03:43来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

java泛型中的通配符

Posted on 2020-01-02 21:57  思思博士  阅读(...)  评论(...)  编辑  收藏

今天在看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的父类。不过多介绍了,用的少。

 


原文链接:https://www.cnblogs.com/guoyansi19900907/p/12142234.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:接口

下一篇:Java 8 Stream 的终极技巧——Collectors 操作