软件编程
位置:首页>> 软件编程>> java编程>> java泛型常用通配符实例解析

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

作者:思思博士  发布时间:2022-09-16 22:14:50 

标签:java,泛型,通配,符

这篇文章主要介绍了java泛型常用通配符实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

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

来源:https://www.cnblogs.com/guoyansi19900907/p/12142234.html

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com