java中泛型上限,下限应用

v 一.程序中无形之中用到的泛型
import java.util.*;
class Person implements Comparable<Person>{String name;int age;Person(){name = "";age = 0;}Person(String name, int age){this.name = name;this.age = age;}public String toString(){return name + "...." + age;}public int compareTo(Person o){if(name.compareTo(o.name)==0)return o.age - age;return o.name.compareTo(name);}
}class Student extends Person{int score;public Student(){super();}public Student(String name, int age, int score){super(name, age);this.score = score;}public String toString(){return  name + "...." + age + "...." + "score: " + score;}
}class Worker extends Person{int salary;public Worker(){super();}public Worker(String name, int age, int salary){super(name, age);this.salary = salary;}public String toString(){return  name + "...." + age + "...." + "salary: " + salary;}
}class ComparatorPerson implements Comparator<Person>{public int compare(Person o1, Person o2){if(o1.name.compareTo(o2.name)==0)return o1.age - o2.age;return o1.name.compareTo(o2.name);}
}public class Test{public static void main(String[] args){ArrayList<Person> arr = new ArrayList<Person>();arr.add(new Person("hujunzheng", 22));arr.add(new Person("caihaibin", 21));arr.add(new Person("huangweidong", 22));ArrayList<Student> arr1 = new ArrayList<Student>();arr1.add(new Student("hujunzheng", 22, 500));arr1.add(new Student("caihaibin", 21, 444));arr1.add(new Student("huangweidong", 22, 777));ArrayList<Worker> arr2 = new ArrayList<Worker>();arr2.add(new Worker("789", 22, 500));arr2.add(new Worker("465", 21, 444));arr2.add(new Worker("798", 22, 777));//public boolean addAll(Collection<? extends E> c)// 泛型的上限:用于存储的数据// 如果不是<? extends E> 而只是<E> 那么E的子类型就不能加载进来!因为Collection<Person> 和 ArrayList<Student>泛型管理的不是同一数据类型// 而 <? extends E> 要求传进来的对象实例管理的泛型只要是 E 或者是 E的子类都行!
       arr.addAll(arr1);arr.addAll(arr2);Object[] oo = null;Arrays.sort(oo=arr.toArray());for(Object o : oo)System.out.println(o);//public TreeSet(Comparator<? super E> c); 传递的是比较泛型为 E 或者是 E的父类的比较器//在进行 E类型两个数据比较的时候, 用 E类 或者 E类型的父类型进行接收,并使用 ?类型的定义的比较方式!
       System.out.println("泛型上限,下限...................................................");TreeSet<Worker> tw = new TreeSet<Worker>(new ComparatorPerson());// E 是 Worker, 传递的是其父类Person的比较器
       tw.addAll(arr2);for(Iterator it = tw.iterator(); it.hasNext(); )System.out.println(it.next());TreeSet<Student> ts= new TreeSet<Student>(new ComparatorPerson());// E 是 Student, 传递的是其父类Person的比较器
       ts.addAll(arr1);for(Object o : ts.toArray())System.out.println(o);//上述的Worker 和 Student在TreeSet中排序时使用的比较器都是Person类实现的比较器
   }
}
v 二.简单的理解

 

ArrayList<Person> alist = new ArrayList<Person>();
ArrayList<? extends Person> list = new ArrayList<Student>();
alist.addAll(list);
Person p = new Person();
Student s = new Student();
//compile error
list.add(p);或者 list.add(s);

一般来讲,定义成<? extends T>的参数通常只能用来从里面取数据,而不能用add方法添加数据。

ArrayList<? super Person> list = new ArrayList<Person>();
Student s = new Student(); 
list.add(s);
s = (Student) list.get(0);

而定义成<? super T>的参数是可以用add方法来进行数据的添加的。它接受的 T类型或者T的父类,为什么Student是Person的子类但是仍能接受呢?因为在加入的时候讲Sutdent进行了向上转型为Object,这就是为什么在取出元素的时候是Object类型了!

转载于:https://www.cnblogs.com/hujunzheng/p/3872633.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/531881.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

株洲c语言培训机构,株洲好就业的学c语言程序设计,计算机专业地址

株洲好就业的学c语言程序设计衡阳市潇湘职业中等专业学校是由衡阳市教育主管&#xff0c;在衡阳校区的基础上设置的一所综合性全日制中等职业学校。坐落在国内优秀旅游城市、国内高新技术产业基地、名人辈出的全国历史文化名城-----衡阳市。我校依托长沙医校院&#xff0c;实现…

er图外键怎么表示_本周话题:取消考研复试最能实现相对公平?你怎么看?

2020取消研究生复试的呼声越来越高&#xff1f;考研er们&#xff1a;压力太大&#xff01;近日&#xff0c;红网作者李诗元的一篇《取消考研复试最能实现相对公平》引起热议国家线的出台和调剂系统5月20日的才开的通知让大家直接炸开了郭就山西大学来说 往年都是调剂生和一志愿…

java中匿名类的注意细节

abstract class Outer{int num;public Outer(int x){num x;}public abstract void show1();public abstract void show2(); }public class PC{public static void main(String[] args){new Outer(55)//构造父类部分//子类重写部分{public void show1(){System.out.println(num…

ios沙箱模式开启_iOS沙盒篇

iOS系统在安全性上的一大亮点就是沙盒。每个iOS应用SDK都被限制在沙盒中&#xff0c;我们可以把沙盒当成一个设置了仅当前SDK可以访问的文件夹&#xff0c;苹果对沙盒有以下几条限制&#xff1a;应用程序可以在自己的沙盒中运行&#xff0c;但不能访问任何其他应用程序的沙盒。…

c语言不定方程的二元一次,poj1061 - 同余方程,二元一次不定方程

以前不会解二元一次不定方程的时候不会做&#xff0c;现在会做了。#include #include using namespace std;typedef __int64 int64;void solveType1(int64 a, int64 b, int64 & x, int64 & y, int64 & d) {if (b 0) {x 1; y 0; d a;return;}int64 _x, _y, _d;s…

java中异常注意的细节1

/* public class Test{public static void main(String[] args){int i0;try{func();//区别就是该函数抛出的异常被封装了&#xff0c;外界不知道到底会不会发生该异常System.out.println("i " i);//所以这句话是有机会执行的}catch(Exception e){System.out.printl…

append 后如何删除_如何在STATA中合并数据文件呢?

❝作者&#xff1a;江小白邮箱&#xff1a;jieresearch163.com❞我们在使用stata进行数据分析时&#xff0c;可能涉及多个数据文档的合并操作或者同时使用不同数据集中的多个变量&#xff0c;这都需要我们进行文档间不同变量的归并。例如&#xff0c;我们需要使用CFPS(中国家庭…

linux 内网怎么安装git环境_linux 安装go环境

官网下载安装包The Go Programming Language​golang.google.cngo1.4.linux-amd64.tar.gz解压&#xff1a;tar -C /usr/local -zxvf go1.4.linux-amd64.tar.gz添加环境变量&#xff1a;export PATH$PATH:/usr/local/go/bin安装完成输入go测试安装成功&#xff0c;写个简单的代码…

java中异常注意问题(发生在多态是的异常问题)

/* 异常的注意事项&#xff1a; 1&#xff0c;子类在覆盖父类方法时&#xff0c;父类的方法如果抛出了异常&#xff0c;那么子类的方法只能抛出父类的异常或者该异常的子类。 2&#xff0c;如果父类抛出多个异常&#xff0c;那么子类只能抛出父类异常的子集。 简单说&#xff1…

cups支持的打印机列表_Win10“Microsoft Print to PDF”虚拟打印机不见了,如何找回?...

MS酋长很早以前在介绍Windows10的新功能时&#xff0c;就提到过《Win10原生支持把文件转换成PDF格式》&#xff0c;该功能实际上是基于“Microsoft Print to PDF”虚拟打印机来实现的。当你点击打印时&#xff0c;在打印机列表中就可以看到“Microsoft Print to PDF”虚拟打印机…

循环队列的进队算法c语言,循环队列的定义,入队算法,出队算法,遍历算法,及其代码实现-Go语言中文社区...

队列 的定义&#xff1a;一种可以是实现“先进先出”的存储结构。数据的进出类似于排队购票。队只允许队尾一端(rear)添加&#xff0c;在另一端队头(front)删除。队有队头(front)和队尾(rear)两个指针。队头front指向第一个元素&#xff0c;队尾rear指向无实际意义的元素&#…

java中paint方法和paintComponent方法的不同

/*1.由Component.java源代码中可以看见其中的paint&#xff08;&#xff09;方法体是空的&#xff0c;在Container中重写了该方法&#xff0c;其子类Window等也重写了该方法2.由JComponent.java源代码中可以看见其中的paint()方法中调用paintComponent, paintChildren, paintBo…

java office文件加水印_文档预览加水印——或可一用的防泄密方式

给文件加水印是常见的一种宣示版权的方式。像Office、WPS都自带加水印功能&#xff0c;能够给文档加上"保密"、"严禁复制"这样的水印。在多可系统中&#xff0c;也有这么一个添加水印的功能。启用该功能后&#xff0c;在使用HTML5预览时&#xff0c;多可系…

android 获取apk资源,android-apk-parser

APK解析库用于读取/解析 packageName。versionName。versionCode信息的简单类&#xff0c;以及已经编译的androidsdk文件中的更多内容。通过解压 AndroidManifest.xml 文件并解码编译好的XML二进制文件来收集这里信息&#xff0c;就可以实现。我一直在用它来实现各种android工件…

apache license 2.0如何使用防止法律纠纷_go语言使用Swaggo详细教程

相信很多程序猿和我一样不喜欢写API文档。写代码多舒服&#xff0c;写文档不仅要花费大量的时间&#xff0c;有时候还不能做到面面具全。但API文档是必不可少的&#xff0c;相信其重要性就不用我说了&#xff0c;一份含糊的文档甚至能让前后端人员打起来。 而今天这篇博客介绍的…

静态代码块,构造代码块,局部代码块演示

public class Test{static int num;static int numObj;//记录有多少个对象产生&#xff01;static{//静态代码块&#xff0c; 是用来给类进行初始化的&#xff01;//num 10;num;num *12;//没有进入静态代码块之前&#xff0c;num的初始化值是0System.out.println(num);//main(…

android执行main函数,AndroidStudio执行main方法报错

问题&#xff1a;有时在开发中想直接写一个java文件来测试一些东西&#xff0c;但是AndroidStudio执行的时候会报错。代码信息&#xff1a;public class HelloWorld {public static void main(String[] args) {System.out.println("HelloWorld");}}报错信息12:04:41:…

模拟java.util.Collection一些简单的用法

/* 需求&#xff1a;模拟java.util.Collection一些简单的用法&#xff01;注意&#xff1a;java虚拟机中并没有泛型类型的对象。泛型是通过编译器执行一个被称为类型擦除的前段转换来实现的。 1&#xff09;用泛型的原生类型替代泛型。 原生类型是泛型中去掉尖括号及其中的类型…

hive 导出json格式 文件_Hive 系列 之 基本操作合集

下面是本课程概览&#xff1a;&#xff08;1&#xff09;hive系列之简介&#xff0c;安装&#xff0c;beeline和hiveserver2&#xff08;2&#xff09;hive系列之基本操作&#xff08;3&#xff09;hive系列之udf&#xff08;4&#xff09;hive系列之二级分区和动态分区&#x…

android开发自定义view倍丝曲线,从0到1Android自定义View(四)贝塞尔曲线

原标题&#xff1a;从0到1Android自定义View(四)贝塞尔曲线2017年安卓巴士全球开发者论坛-上海站作者本文由两点水投稿&#xff0c;博客地址&#xff1a;http://www.apkbus.com/myspaceblog-911082.html前言扯来扯去&#xff0c;前面三篇自定义 View 文章&#xff0c;终于扯完了…