java泛型常用通配符实例解析
作者:思思博士 时间:2022-09-16 22:14:50
这篇文章主要介绍了java泛型常用通配符实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
今天在看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
标签:java,泛型,通配,符
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
SpringBoot项目创建使用+配置文件+日志文件详解
2023-11-20 12:49:43
![](https://img.aspxhome.com/file/2023/9/59509_0s.jpg)
辨析Java中的String与StringBuffer及StringBuilder字符串类
2023-08-21 19:59:50
java实现大文件分割与合并的实例代码
2023-11-11 04:31:21
浅谈JVM垃圾回收有哪些常用算法
2022-02-28 16:51:56
解决@RequestBody部分属性丢失的问题
2023-08-01 15:00:21
![](https://img.aspxhome.com/file/2023/1/63171_0s.png)
mybatis mybatis-plus-generator+clickhouse自动生成代码案例详解
2021-06-06 10:12:55
Mybatis-plus基于redis实现二级缓存过程解析
2021-12-08 23:34:43
![](https://img.aspxhome.com/file/2023/1/63151_0s.png)
Java List分页功能实现代码实例
2022-06-02 13:56:14
java实现列表、集合与数组之间转化的方法
2023-11-29 10:17:38
自定义mybatis插件如何实现sql日志打印
2023-11-29 11:22:37
![](https://img.aspxhome.com/file/2023/0/60670_0s.png)
springboot如何实现自动装配源码解读
2023-11-10 15:44:20
Java的Swing编程中使用SwingWorker线程模式及顶层容器
2021-09-09 08:45:06
基于ThreadLocal 的用法及内存泄露(内存溢出)
2023-11-23 20:22:28
![](https://img.aspxhome.com/file/2023/9/66509_0s.png)
Spring Data JPA 之 JpaRepository的使用
2023-11-24 21:23:40
![](https://img.aspxhome.com/file/2023/4/60114_0s.jpg)
Java中的ArrayList容量及扩容方式
2023-10-17 17:24:40
SpringBoot详细讲解yaml配置文件的用法
2022-04-21 16:29:33
![](https://img.aspxhome.com/file/2023/0/61030_0s.png)
Maven的porfile与SpringBoot的profile结合使用案例详解
2023-11-14 00:07:59
![](https://img.aspxhome.com/file/2023/2/58752_0s.png)
springboot之如何获取项目目录路径
2022-08-09 21:44:17
![](https://img.aspxhome.com/file/2023/6/60796_0s.jpg)
微信开发--自定义菜单查询返码乱码的解决方法
2023-11-25 04:47:55
spring cloud整合ribbon问题及解决方案
2023-07-25 04:24:49
![](https://img.aspxhome.com/file/2023/3/57823_0s.png)