java中的泛型
来源:互联网 发布:程序员用机械键盘推荐 编辑:程序博客网 时间:2024/06/16 22:06
java中的泛型
** * 泛型<>: * jdk1.5出现 的安全机制 * 注意:泛型里全放的是引用类型的数据,不能放基本数据类型。 * 好处: * 1.将运行时期的问题ClassCastException转到了编译时期 * 2.避免了转换的麻烦 * <>什么时候用,当操作的引用数据类型不确定 的时候,就使用<>。将要操作的引用数据类型传入即可 * 其实<>就是一个用于接收具体 引用数据类型的参数范围 * * 在程序中,只要用到了带有<>的类或者接口,就要明确传入的具体引用数据类型 * 泛型技术 是给编译器使用的技术,用于编译时期,确保了类型的安全 * 运行时,会将泛型去掉,生成的class文件中是不带泛型的。这个称为泛型的擦除。 * 因为为了兼容运行时的类加载器。 * 泛型的补偿:在运行时,通过 获取元素的类型进行转换动作,不用使用者再强制转换了 * * 在jdk1.5后,使用泛型来接收类中要操作的引用数据类型 * 泛型类,什么时候 用?当类中的操作的引用数据不确定 的时候 ,就使用泛型 来表示 * * 泛型的通配符:?未知类型 * * 迭代集合中元素 * 可以对类型进行限定: * ?extends E:接收E类型或者E的子类型对象 ,这叫上限 * ? super E:接收E类型或者E的父类型。下限 */一,泛型作用在集合中// 示例一:public class GenericDemo { public static void main(String[] args){ test1(); test2(); test3(); } private static void test3() { ArrayList<String> arrayList = new ArrayList<String>(); arrayList.add("aaaa"); arrayList.add("aaaa"); arrayList.add("aaaa");// Iterator<String> iterator = arrayList.iterator();// while (iterator.hasNext()){// String str = iterator.next();// System.out.println(str);// } iter(arrayList); } //TreeSet private static void test2() { TreeSet<Person> treeSet = new TreeSet<Person>(); treeSet.add(new Person("zhangsan", 10)); treeSet.add(new Person("lisi", 20)); treeSet.add(new Person("wangwu", 20)); treeSet.add(new Person("angwu", 20)); treeSet.add(new Person("zhaoliu", 30)); treeSet.add(new Person("houqi", 30)); iter(treeSet); } private static void test1() { ArrayList<String> arrayList = new ArrayList<>(); arrayList.add("aaaa"); arrayList.add("bbb"); arrayList.add("ccc"); arrayList.add("ddd"); iter(arrayList); } //利用泛型封装成共性方法 private static<T> void iter(Collection<T> treeSet) { Iterator<T> iterator = treeSet.iterator(); while (iterator.hasNext()){ T t = iterator.next(); System.out.println(t); } }}示例一打印的结果为:
aaaa
bbb
ccc
ddd
--------------------------
zhangsan:10
angwu:20
lisi:20
wangwu:20
houqi:30
zhaoliu:30
--------------------------
aaaa
aaaa
aaaa
二,泛型作用在类和方法上
示例二:// 工具类中带有泛型public class Tool<T> { private T t; public T getT() { return t; } public void setT(T t) { this.t = t; } //将泛型定义 在方法上 public <R>void show(R str){ System.out.println("show"+str); } //当方法静态时,不能访问类上定义 的泛型,如果静态方法使用泛型 ,只能将泛型定义在方法上 public static<Y> void method(Y obj){ System.out.println("method..."+obj); }}public class GenericDemo2 { public static void main(String[] args){ Tool<Worker> tool = new Tool<Worker>(); tool.setT(new Worker("jjj",22)); Worker worker = (Worker) tool.getT(); System.out.println(worker); Tool<String> tool1 = new Tool<>(); tool1.show(new Integer(5)); Tool.method("haha"); }}示例二打印的结果为:
Worker...jjj:22
show5
method...haha
三,泛型作用在接口上
示例三:接口中带有泛型public interface Inter<T> { public void show(T t);}class InterImpl2<T> implements Inter<T>{ @Override public void show(T t) { System.out.println("show:"+t); }}class InterImpl implements Inter<String>{ @Override public void show(String s) { System.out.println("str:"+s); }}public class GenericDemo3 { public static void main(String[] args){ InterImpl inter = new InterImpl(); inter.show("hdha"); InterImpl2 <String>interImpl2 = new InterImpl2<String>(); interImpl2.show("jjj"); }}示例三打印结果为:
str:hdha
show:jjj
四,泛型的通配符,泛型的上限,泛型的下限
//示例四:泛型的通配符public class GenericAdvanceDemo { public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); list.add("aaa"); list.add("bbb"); HashSet<Integer> list2 = new HashSet<>(); list2.add(22); list2.add(33); iteratCollection(list); iteratCollection(list2); } private static void iteratCollection(Collection<?> list) { Iterator<?> iterator = list.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); } }}打印结果为:aaabbb3322示例五:泛型的上限和下限打印结果为:public class GenericAdvanceDemo3 { public static void main(String[] args) { ArrayList<Worker> list = new ArrayList<>(); list.add(new Worker("aaa", 22)); list.add(new Worker("bbb", 20)); ArrayList<Person> list2 = new ArrayList<>(); list2.add(new Worker("aaa", 22)); list2.add(new Worker("bbb", 20)); ArrayList<Student> list3 = new ArrayList<>(); list3.add(new Student("aaa", 22)); list3.add(new Student("bbb", 20)); list2.addAll(list3); iteratCollection(list2); iteratCollection2(list2); } //上限 private static void iteratCollection(Collection<? extends Person> list) { Iterator<? extends Person> iterator = list.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); } System.out.println("----------------------"); } //下限 private static void iteratCollection2(Collection<? super Person> list) { Iterator<? super Person> iterator = list.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); } System.out.println("----------------------"); } //一般在存储元素的时候 都使用上限,因为这样取出都 是按照上限类型来运算的,不会出现安全隐患 class MyCollection<E>{ public void add(E e){ } public void addAll(MyCollection<? extends E> e){ } }}
Worker...aaa:22
Worker...bbb:20
Student...aaa:22
Student...bbb:20
----------------------
Worker...aaa:22
Worker...bbb:20
Student...aaa:22
Student...bbb:20
----------------------
示例六:泛型的下限使用
在使用TreeSet时,一定要使用比较器public class GenericAdvanceDemo4 { public static void main(String[] args) { TreeSet<Worker> list = new TreeSet<>(); list.add(new Worker("bbb", 20)); list.add(new Worker("aaa", 22)); list.add(new Worker("ccc", 20)); TreeSet<Person> list2 = new TreeSet<>(new CompByName()); list2.add(new Worker("bbb", 20)); list2.add(new Worker("aaa", 22)); list2.add(new Worker("ccc", 20)); TreeSet<Student> list3 = new TreeSet<>(); list3.add(new Student("bbb", 20)); list3.add(new Student("aaa", 22)); list3.add(new Student("ccc", 20)); Iterator<Person> iterator = list2.iterator(); while (iterator.hasNext()){ System.out.println(iterator.next()); } }}/** * class TreeSet<Worker>{ * Tree(Comparator<? super Worker>); * 什么时候用下限呢,通常参集合中的元素进行取出操作时,可以使用下限 * } */class CompByName implements Comparator<Person> { @Override public int compare(Person person, Person t1) { int temp = person.getName().compareTo(t1.getName()); return temp == 0 ? person.getAge() - t1.getAge() : temp; }}
阅读全文
0 0
- Java中的泛型
- Java中的泛型
- Java中的泛型
- java中的泛型
- JAVA 中的泛型
- Java中的泛型
- java中的泛型
- Java中的泛型
- Java中的泛型
- JAVA中的泛型
- java中的泛型
- java中的泛型
- Java中的泛型
- Java中的泛型
- java中的泛型
- java中的泛型
- Java中的泛型
- java中的泛型
- Hive编程(九)【模式设计】
- PostgreSQL Serial类型和序列及子查询(五)
- Unity2017 UnityAds 问题
- 编译错误"/usr/bin/ld: cannot find -lz"
- poj2891 Strange Way to Express Integers【解一元线性同余方程组模板】
- java中的泛型
- vuex入门教程
- 【云星数据---Scala实战系列(精品版)】:Scala入门教程061-Scala实战源码-Scala包引用的语法
- python全局变量小心得
- Linux下php安装Redis扩展
- scala ide 报错:错误: 找不到或无法加载主类
- LINUX设置固定IP上网方法
- 算法训练 连续正整数的和
- jQuery操作样式