java泛型中的通配符
程序员文章站
2023-12-31 18:02:28
今天在看ArrayList原码是看到这样的一个符号,好奇怪。?表示通配符,表示的意思是匹配E或E的子类,具体类型未知。 1.限定通配符 编写一个类似于ArrayList的动态数据 修改上面的代码,将addAll参数改成如下 这个时候代码编译通过了。并且能够正常的访问其中的元素。 2.无限定通配符。 ......
今天在看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的父类。不过多介绍了,用的少。