Java泛型通配符的使用
目录
泛型在继承方面的体现
类A是类B的父类,G和G二者不具有子父类关系,二者是并列关系
类A是类B的父类,A是B的父类
通配符的使用
类A是类B的父类,G和G是没有关系的,二者共同父类是:G
使用通配符后,数据的写入和读取要求
有限制条件的通配符的使用
自定义泛型的测试
User类
DAO类
DAOTest
泛型在继承方面的体现
类A是类B的父类,G<A>和G<B>二者不具有子父类关系,二者是并列关系
@Testpublic void test1() {Object obj=null;String str=null;obj=str;//编译通过Object[] arr1=new Object[10];String arr2[]=new String[10];arr1=arr2;//编译通过//此时的list1和list2不具有子父类关系List<Object> list1=null;List<String> list2=null;//编译不通过list1=list2;show(list1);//编译不通过show(list2);}public void show(List<Object> list) {}
类A是类B的父类,A<G>是B<G>的父类
@Testpublic void test2() {AbstractList<String> list1=null;List<String> list2=null;ArrayList<String>list3=null;list1=list3;//编译通过list2=list3;//编译通过}
通配符的使用
通配符?
类A是类B的父类,G<A>和G<B>是没有关系的,二者共同父类是:G<?>
@Testpublic void test4() {List<Object> list1=null;List<String> list2=null;List<?> list=null;list=list1;//编译通过list=list2;//编译通过print(list1);//编译通过print(list2);//编译通过}public void print(List<?> list) {Iterator<?> it=list.iterator();while(it.hasNext()) {Object obj=it.next();System.out.println(obj);}}
使用通配符后,数据的写入和读取要求
添加:对于List<?>就不能向其内部添加数据,除了添加null之外
获取:允许读取数据,读取的数据类型为Object
@Testpublic void test5() {List<?> list=null;List<String> list3=new ArrayList<>();list3.add("AAA");list3.add("BBB");list3.add("CCC");list=list3;//添加:对于List<?>就不能向其内部添加数据。//除了添加null之外list.add("DD"); //编译不通过list.add("?"); //编译不通过list.add(null); //编译通过//获取:允许读取数据,读取的数据类型为ObjectObject obj = list.get(0);System.out.println(obj);}
有限制条件的通配符的使用
? extends A:
G<? extends A>可以作为G<A>和G<B>的父类,其中,B是A的子类
G存储的是A和A的子类
? super Person:
G<? super A>可以作为G<A>和G<B>的父类,其中,B是A的父类
G存储的是A和A的父类
@Testpublic void test6() {List<? extends Person> list1=null;List<? super Person> list2=null;List<Student> list3=new ArrayList<>();List<Person> list4=new ArrayList<>();;List<Object> list5=new ArrayList<>();;list1=list3; //编译通过list1=list4; //编译通过list1=list5; //编译不通过list2=list3; //编译不通过list2=list4; //编译通过list2=list5; //编译通过//读取数据list1=list3;Person p = list1.get(0); //编译通过Student st=list1.get(0); //编译不通过list2=list4;Object obj = list2.get(0); //编译通过Person obj2=list2.get(0); //编译不通过//写入数据list1.add(new Student()); //编译不通过list2.add(new Person()); //编译通过list2.add(new Student()); //编译通过}
自定义泛型的测试
User类
public class User {@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + age;result = prime * result + id;result = prime * result + ((name == null) ? 0 : name.hashCode());return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;User other = (User) obj;if (age != other.age)return false;if (id != other.id)return false;if (name == null) {if (other.name != null)return false;} else if (!name.equals(other.name))return false;return true;}@Overridepublic String toString() {return "User [id=" + id + ", age=" + age + ", name=" + name + "]";}public int getId() {return id;}public void setId(int id) {this.id = id;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public User() {}private int id;public User(int id, int age, String name) {super();this.id = id;this.age = age;this.name = name;}private int age;private String name;
}
DAO类
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** 定义泛型类DAO<T>* 创建一下方法* public void save(String id ,T entity):保存T类型对象到Map变量中* public T get(String id):从map中获取id对应的对象* public void update(String id,T entity):替换map中key为id的内容,改为entity对象* public List<T> list():返回map中存放的所有T对象* public void delete (String id):删除指定id对象* * @author CharlieLiang* @param <T>**/
public class DAO<T> {private Map<String,T> map;public DAO() {map=new HashMap<>();}//保存T类型对象到Map变量中public void save(String id ,T entity) {map.put(id, entity);}//从map中获取id对应的对象public T get(String id) {return map.get(id);}//替换map中key为id的内容,改为entity对象public void update(String id,T entity) {if(map.containsKey(id)) {map.put(id, entity);}}//返回map中存放的所有T对象public List<T> list(){//错误的
// Collection<T> values = map.values();
// return (List<T>) values;//正确的List<T> list=new ArrayList<>();Collection<T> values = map.values();for(T t:values) {list.add(t);}return list;}//删除指定id对象public void delete (String id) {map.remove(id);}
}
DAOTest
import java.util.List;import org.junit.jupiter.api.Test;public class DAOTest {@Testpublic void testList() {DAO<User> dao = new DAO<>();dao.save("1001", new User(1001,34,"周杰伦"));dao.save("1002", new User(1002,20,"昆凌"));dao.save("1003", new User(1002,20,"蔡依林"));List<User> list = dao .list();list.forEach( i->System.out.println(i));}@Testpublic void testUpdate() {DAO<User> dao = new DAO<>();dao.save("1001", new User(1001,34,"周杰伦"));dao.save("1002", new User(1002,20,"昆凌"));dao.save("1003", new User(1002,20,"蔡依林"));dao.update("1003", new User(1003,40,"方文山"));List<User> list=dao.list();list.forEach(i->System.out.println(i));}@Testpublic void testDelete() {DAO<User> dao = new DAO<>();dao.save("1001", new User(1001,34,"周杰伦"));dao.save("1002", new User(1002,20,"昆凌"));dao.save("1003", new User(1002,20,"蔡依林"));dao.delete("1003");List<User> list=dao.list();list.forEach(i->System.out.println(i));}
}
Java泛型通配符的使用相关推荐
- Java泛型 通配符? extends与super
本文来源:https://i.cnblogs.com/EditPosts.aspx?opt=1 感谢博主.本文仅供参考学习. Java 泛型 关键字说明 ? 通配符类型 <? extends T ...
- 聊一聊Java 泛型通配符 T,E,K,V,?
欢迎关注方志朋的博客,回复"666"获面试宝典 | 前言 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者 ...
- [转]JAVA泛型通配符T,E,K,V区别,T以及ClassT,Class?的区别
原文地址:https://www.jianshu.com/p/95f349258afb 1. 先解释下泛型概念 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被 ...
- 不正确 有三种形式 说法 通配泛型_一看就懂 详解JAVA泛型通配符T,E,K,V区别...
1. 先解释下泛型概念 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛 ...
- java 通配符 类_关于类:具有多个类的Java泛型通配符
我想要一个类对象,但是我想要强制它所代表的任何类来扩展类A和实现接口B. 我能做到: Class extends ClassA> 或: Class extends InterfaceB> ...
- (转)JAVA泛型通配符T,E,K,V区别,T以及Class,Class的区别
1. 先解释下泛型概念 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛 ...
- JAVA泛型通配符T,E,K,V区别,T以及ClassT,ClassT的区别
原文地址:https://www.jianshu.com/p/95f349258afb 1. 先解释下泛型概念 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被 ...
- java泛型通配符和类型参数的范围
本节先讲解如何限制类型参数的范围,再讲解通配符(?). 类型参数的范围 在泛型中,如果不对类型参数加以限制,它就可以接受任意的数据类型,只要它是被定义过的.但是,很多时候我们只需要一部分数据类型就够了 ...
- java 泛型 通配符边界和类型形参边界的区别
通配符只能有一个边界,而类型形参可以有多个边界 通配符可以有上界或者下界,而类型形参没有下界<super> 参考: http://www.angelikalanger.com/Generi ...
最新文章
- 我不是人:一年发论文180篇,横跨多个学科领域,收获99次引用
- Purism 发布 PureBoot:高度安全、完整的 Linux 引导流程
- spring中的quartz调度问题
- The Best Way to Export an SVG from Sketch
- 用Django开发Web应用程序异常
- L1-011 A-B(13行代码AC!!)
- css3制作滚动按钮
- form表单重复提交
- 高中计算机课程打字网址,信息课
- 和 jQuery 说再见!Bootstrap 5 将移除对其依赖
- Android--数据持久化之内部存储、Sdcard存储
- JavaScript变量的声明与使用以及命名规范(3)
- 【SAP-FICO详细教程】
- html默认初始代码
- meda中的一些小事项
- 本地电脑如何搭建web网站,并发布到公网访问?1-2
- 58同成前端面试分析
- 七天学会「股票数据分析软件」的开发(上)
- matlab 验证两个电阻并联误差会变小
- LTE default bearer dedicated bearer and radio bearer
热门文章
- 计算机组装与维修学哪些,计算机组装与维修学习知识点总结计划.docx
- AutoCAD2012从入门到精通中文视频教程 第25课 缩放 倒角 圆角(个人收藏)
- iOS 系统校园无线WIFI认证上网指南
- 十句让生活更美好的英语箴言
- Java P1443 马的遍历
- FLTK Debian 安装中make报错 X11 libraries No package ‘xft‘ found No package ‘freetype2‘ found
- 文本转语音免费 微软Azure官网,在线就可以转语音。
- MaixII-Dock(v831)学习笔记——MaixII-Dock初使用
- Mac中安装多个JDK版本
- 如何构造PKCS 7签名(一)