java泛型中的通配符
2023-09-11 14:22:24 时间
今天在看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的父类。不过多介绍了,用的少。
相关文章
- java对字符串进行加密和解密(以下是来自其他博主)
- JAVA环境变量JAVA_HOME、CLASSPATH、PATH设置详解
- Word处理控件Aspose.Words功能演示:使用Java合并MS Word文档
- java——定义一个功能将ArrayList 集合中的重复元素删除(java集合七)
- 饿了么面试——高级java软件工程师经验
- JAVA语言规范:线程和锁
- Java项目(前端vue后台java微服务)在线考试系统(java+vue+springboot+mysql+maven)
- java高级程序员线程池剖析面试题及答案
- 【Java】java数据库连接池配置的几种方法
- Java中toArray的用法探究(java数组与list转换)
- java 泛型--桥方法
- 【java】异常
- java 泛型
- java高并发,如何解决,什么方式解决
- Java线程锁,synchronized、wait、notify详解--java 管程
- 在java中使用JMH(Java Microbenchmark Harness)做性能测试
- Java泛型基础知识笔记:泛型定义模板的意义、泛型的擦拭法、extends和super通配符区别、PESC原则
- JAVA泛型
- java运算符
- Java笔记14:泛型初探
- Java hutool/java 常用方法