欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java泛型中的通配符

程序员文章站 2022-03-25 18:51:13
今天在看ArrayList原码是看到这样的一个符号,好奇怪。?表示通配符,表示的意思是匹配E或E的子类,具体类型未知。 1.限定通配符 编写一个类似于ArrayList的动态数据 修改上面的代码,将addAll参数改成如下 这个时候代码编译通过了。并且能够正常的访问其中的元素。 2.无限定通配符。 ......

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

java泛型中的通配符

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);
    }
}

 

 java泛型中的通配符

 

 

修改上面的代码,将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));
        }
    }

 

java泛型中的通配符

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

/**
     *判断元素是否存在
     */
    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的父类。不过多介绍了,用的少。