目录

泛型在继承方面的体现

类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泛型通配符的使用相关推荐

  1. Java泛型 通配符? extends与super

    本文来源:https://i.cnblogs.com/EditPosts.aspx?opt=1 感谢博主.本文仅供参考学习. Java 泛型 关键字说明 ? 通配符类型 <? extends T ...

  2. 聊一聊Java 泛型通配符 T,E,K,V,?

    欢迎关注方志朋的博客,回复"666"获面试宝典 | 前言 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者 ...

  3. [转]JAVA泛型通配符T,E,K,V区别,T以及ClassT,Class?的区别

    原文地址:https://www.jianshu.com/p/95f349258afb 1. 先解释下泛型概念 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被 ...

  4. 不正确 有三种形式 说法 通配泛型_一看就懂 详解JAVA泛型通配符T,E,K,V区别...

    1. 先解释下泛型概念 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛 ...

  5. java 通配符 类_关于类:具有多个类的Java泛型通配符

    我想要一个类对象,但是我想要强制它所代表的任何类来扩展类A和实现接口B. 我能做到: Class extends ClassA> 或: Class extends InterfaceB> ...

  6. (转)JAVA泛型通配符T,E,K,V区别,T以及Class,Class的区别

    1. 先解释下泛型概念 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛 ...

  7. JAVA泛型通配符T,E,K,V区别,T以及ClassT,ClassT的区别

    原文地址:https://www.jianshu.com/p/95f349258afb 1. 先解释下泛型概念 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被 ...

  8. java泛型通配符和类型参数的范围

    本节先讲解如何限制类型参数的范围,再讲解通配符(?). 类型参数的范围 在泛型中,如果不对类型参数加以限制,它就可以接受任意的数据类型,只要它是被定义过的.但是,很多时候我们只需要一部分数据类型就够了 ...

  9. java 泛型 通配符边界和类型形参边界的区别

    通配符只能有一个边界,而类型形参可以有多个边界 通配符可以有上界或者下界,而类型形参没有下界<super> 参考: http://www.angelikalanger.com/Generi ...

最新文章

  1. 我不是人:一年发论文180篇,横跨多个学科领域,收获99次引用
  2. Purism 发布 PureBoot:高度安全、完整的 Linux 引导流程
  3. spring中的quartz调度问题
  4. The Best Way to Export an SVG from Sketch
  5. 用Django开发Web应用程序异常
  6. L1-011 A-B(13行代码AC!!)
  7. css3制作滚动按钮
  8. form表单重复提交
  9. 高中计算机课程打字网址,信息课
  10. 和 jQuery 说再见!Bootstrap 5 将移除对其依赖
  11. Android--数据持久化之内部存储、Sdcard存储
  12. JavaScript变量的声明与使用以及命名规范(3)
  13. 【SAP-FICO详细教程】
  14. html默认初始代码
  15. meda中的一些小事项
  16. 本地电脑如何搭建web网站,并发布到公网访问?1-2
  17. 58同成前端面试分析
  18. 七天学会「股票数据分析软件」的开发(上)
  19. matlab 验证两个电阻并联误差会变小
  20. LTE default bearer dedicated bearer and radio bearer

热门文章

  1. 计算机组装与维修学哪些,计算机组装与维修学习知识点总结计划.docx
  2. AutoCAD2012从入门到精通中文视频教程 第25课 缩放 倒角 圆角(个人收藏)
  3. iOS 系统校园无线WIFI认证上网指南
  4. 十句让生活更美好的英语箴言
  5. Java P1443 马的遍历
  6. FLTK Debian 安装中make报错 X11 libraries No package ‘xft‘ found No package ‘freetype2‘ found
  7. 文本转语音免费 微软Azure官网,在线就可以转语音。
  8. MaixII-Dock(v831)学习笔记——MaixII-Dock初使用
  9. Mac中安装多个JDK版本
  10. 如何构造PKCS 7签名(一)