黑马程序员_泛型

--------------------ASP.Net+Android+IOS开发、.Net培训、期待与您交流! --------------------


 

1.     泛型

     1.概述

 

           泛型是为了解决了集合中存储对象安全问题,如果集合中存数了不同类型的对象,那么读取出来后,操作取出的对象以为不知道类型,会出现安全问题,但是这不会在编译时期提示错误,而是会在运行时期出现问题,所以泛型会把运行时期的错误移到了编译时期,那么错误就会避免。

     2.集合中的泛型

           在集合中都会存在泛型,下同时迭代器中也定义了泛型,在读取出来后,我们也要指定迭代器的类型,这样我们就不需要强制类型转换了,因为迭代器中就指定了类型,所以读取出来的对象类型也就是我们指定的类型。

 

 

package www.fuxi.jihe;import java.util.ArrayList;
import java.util.Iterator;public class fanxingDemo {public static void main(String[] args) {ArrayList<String> list = new ArrayList<String>();list.add("zhangsan");// 在这里必须传入的String对象,如果不是那么编译会出错误list.add("lisi");Iterator<String>it = list.iterator();// 在这里也要指定迭代器的类型while (it.hasNext()) {String s = it.next();// 在这里不需要强制类型转换为String了,因为迭代器已经指定了类型System.out.println(s);}}}
结果:
zhangsan
lisi


 

 

 

2.     自定义泛型类

自定义的泛型类,可以按照我们随意要求指定类型

 

 

package www.fuxi.jihe;/*** 在此类型定义了一个泛型,这个字母可以随便定义当创建了此类的对象,那么就需要指定泛型的类型,那么里面的成员泛型就统一指定了*/
package www.fuxi.jihe;public class Demo<T> {private T t;public void set(T t){//此方法是和类上的泛型一起变化this.t=t;System.out.println("set:"+t);}public static void main(String [] agrs){Demo<String> d=new Demo<String>();d.set("123");}}
结果:
set:123


 

 

3.     泛型方法

1.     一个泛型

   

public class Demo<T> {public void show(T t) {System.out.println("show:" + t);}public void print(T t) {System.out.println("print:" + t);}public static void main(String[] args) {Demo<String> d = new Demo<String>();d.show("hello");d.print("world");// d.show(new// Integer(2));//在这里编译出错,因为d对象泛型已经指定了是String类型,所以参数全部是String类型System.out.println("-----------");Demo<Integer> d1 = new Demo<Integer>();d1.show(new Integer(3));d1.print(new Integer(6));}}
结果:
show:hello
print:world
-----------
show:3
print:6

 

 

 

2.     多个泛型

 

 

package www.fuxi.jihe;public class Demo<T> {public void set(T t){//此方法是和类上的泛型一起变化System.out.println("set:"+t);}public <Q> void get(Q q){//此方法上的泛型是和类上的泛型无关,可以是任意类型System.out.println("get:"+q);}public static void main(String [] agrs){Demo<String> d=new Demo<String>();d.set("123");d.get("abc");d.get(5);}}结果:
set:123
get:abc
get:5


 

从结果可以看出,这个类中既有和类上的泛型一起变化的,也有自己特有的方法,例如:get()方法上的泛型,可以和类上的一样也可以不一样。

 

3.静态方法上的泛型

  把泛型定义在返回值和修饰符之间

静态方法上的泛型的定义需要自己定义,不要和类上的泛型统一,因为静态方法只要是类一加载就生成,如果和类上的泛型统一的话,在静态方法加载的时候,没有对象生成,也就没有指定泛型的类型,那么就会出错,这些都和泛型定义出现的时间有关。

 

 

package www.fuxi.jihe;public class Demo<T> {public static <Q> void show(Q q){//这里不要和类上的泛型统一System.out.println("show:"+q);}public static void main(String [] agrs){Demo.show("hello");}}
结果:
show:hello


 

4.     接口泛型

     在接口上自定义泛型

 

 

package www.fuxi.jihe;interface inter<T> {void show(T t);
}/* 第一种实现泛型接口,在接口上指定泛型类型 */
public class Demo implements inter<String> {public void show(String t) {System.out.println("show:" + t);}public static void main(String[] agrs) {Demo d = new Demo();d.show("hellowrold");}
}
结果:
show:hello world


 

 

下面是在对象是上指定泛型类型

 

 

package www.fuxi.jihe;interface inter<T> {void show(T t);
}/* 第二种实现泛型接口,在接口上不定义泛型,而是在对象上指定泛型类型 */
public class Demo<T> implements inter<T> {public void show(T t) {System.out.println("show:" + t);}public static void main(String[] agrs) {Demo<Integer> d = new Demo<Integer>();d.show(3);}
}结果:
show:3


 

5.     泛型的高级应用

1.     通配符

通配符用?表示,也叫占位符,可以表示任意类型

 

 

package www.fuxi.jihe;import java.util.ArrayList;
import java.util.Iterator;public class Demo {/*在这里泛型类型使用通配符表示,表次是此可以传入任意类型*/public void show(ArrayList<?> list) {Iterator<?> it = list.iterator();while (it.hasNext()) {System.out.println(it.next());}}public static void main(String[] agrs) {Demo d = new Demo();ArrayList<String> l1 = new ArrayList<String>();l1.add("abc");l1.add("123");l1.add("ased");d.show(l1);System.out.println("---------");ArrayList<Integer> l2 = new ArrayList<Integer>();l2.add(1);l2.add(2);l2.add(3);d.show(l2);}
}
结果:
abc
123
ased
---------
1
2
3


 

 

但是也可以使用另一中方式表示,但是其有缺点,不能表示一个范围类型,通配符可以表示一个类型范围,详细“2.参考通配符设置上下限”

 

 

package www.fuxi.jihe;import java.util.ArrayList;
import java.util.Iterator;public class Demo {/* 在这里泛型类型使用通配符表示,表次是此可以传入任意类型 */public <T> void show(ArrayList<T> list) {Iterator<T> it = list.iterator();while (it.hasNext()) {T t= it.next();System.out.println(t);}}public static void main(String[] agrs) {Demo d = new Demo();ArrayList<String> l1 = new ArrayList<String>();l1.add("abc");l1.add("123");l1.add("ased");d.show(l1);System.out.println("---------");ArrayList<Integer> l2 = new ArrayList<Integer>();l2.add(1);l2.add(2);l2.add(3);d.show(l2);}
}结果:
abc
123
ased
---------
1
2
3


 

从结果上可以看出,结果和使用通配符是一样的,这个好处可以把对象取出来,可以进行操作,T t= it.next();但是使用通配符的话,就不能进行此操作,但是通配符可以设置上下限。

2.     通配符设置上下限

? extends E :?表示可以是E类型或者是E的子类,这是设置的上限

? super E:?表示的可以是E类型或者E的父类类型,这是设置的下限

 

设置上限

 

 

package www.fuxi.jihe;import java.util.ArrayList;
import java.util.Iterator;class door {privateString name;publicdoor(String name) {this.name= name;}publicString toString() {returnthis.name;}
}class tieDoor extends door {// 继承了door类publictieDoor(String name) {super(name);}
}public class fanxingDemo {publicvoid show(ArrayList<? extends door> list) {// 设置类泛型的限,可以是door类型或者是door的子类型Iterator<?extends door> it = list.iterator();while(it.hasNext()) {System.out.println(it.next());}}publicstatic void main(String[] args) {fanxingDemod = new fanxingDemo();ArrayList<tieDoor>list = new ArrayList<tieDoor>();list.add(newtieDoor("door-1"));list.add(newtieDoor("door-2"));list.add(newtieDoor("door-3"));d.show(list);}}
结果:
door-1
door-2
door-3


 

 

设置下限:

 

TreeSet(Comparator<?super E> comparator)
          构造一个新的空 TreeSet,它根据指定比较器进行排序。

我们就根据这个比较器看看设置下限:

 

package www.fuxi.jihe;import java.util.ArrayList;
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;class door {privateString name;publicdoor(String name) {this.name= name;}publicString toString() {returnthis.name;}publicString getName(){returnthis.name;}
}class tieDoor extends door {// 继承了door类publictieDoor(String name) {super(name);}
}class MyCom implements Comparator<door>{publicint compare(door o1, door o2) {returno1.getName().compareTo(o2.getName());}}
public class fanxingDemo {publicstatic void main(String[] args) {fanxingDemod = new fanxingDemo();TreeSet<tieDoor>list = new TreeSet<tieDoor>(new MyCom());list.add(newtieDoor("door-3"));list.add(newtieDoor("door-1"));list.add(newtieDoor("door-2"));Iterator<tieDoor>it=list.iterator();while(it.hasNext()){System.out.println(it.next());}}}
结果:
door-1
door-2
door-3



 

从结果可以看出,已经比较了,但是设置的比较器是父类型,但是TreeSet集合设置的door的子类型,也可以排序,就是可以是下限或者是下限的父类型

可以是tieDoor类型或者tieDoor的父类型,都可以进行比较

假如又有一个类继承了door类,那么此子类对象添加到在TreeSet中,也可以使用当前的比较器进行排序。


--------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流! --------------------


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

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

相关文章

菜鸟成长记(十一)----- 操蛋的2016与未知的2017

现在已经2017.1.16号了&#xff0c;早就说着要写篇总结&#xff0c;骂骂特么操蛋的自己&#xff0c;当然这两三年来在这里骂的真特么不在少数了&#xff0c;但是都是特么一拖再拖&#xff0c;刚刚明明是在看TPO阅读的&#xff0c;但是特么实在是无法集中精神的看&#xff0c;作…

VS.NET版本与VC版本对应关系

vc6 -> vc6vs2003 -> vc7vs2005 -> vc8vs2008 -> vc9vs2010 -> vc10vs2012 -> vc11vs2013 -> vc12仅供参考&#xff01;

sql2008 获取表结构说明

SELECT 表名 case when a.colorder1 then d.name else end, 表说明 case when a.colorder1 then isnull(f.value,) else end, 字段序号 a.colorder, 字段名 a.name, 标识 case when COLUMNPROPERTY( a.id,a.name,IsIdentity)1 th…

Linux ALSA声卡驱动之四:Control设备的创建

声明&#xff1a;本博内容均由http://blog.csdn.net/droidphone原创&#xff0c;转载请注明出处&#xff0c;谢谢&#xff01; Control接口 Control接口主要让用户空间的应用程序&#xff08;alsa-lib&#xff09;可以访问和控制音频codec芯片中的多路开关&#xff0c;滑动控件…

【linux】信号量的值定义

参见文件&#xff1a;/usr/include/bits/signum.h /* Signal number definitions. Linux version.Copyright (C) 1995-2013 Free Software Foundation, Inc.This file is part of the GNU C Library.The GNU C Library is free software; you can redistribute it and/ormodi…

汇编学习笔记-序章

最近突然对汇编语言开始感兴趣&#xff0c;于是说干就干了。 之前也自学过一点汇编&#xff0c;是跟着王爽老师的《汇编语言(第3版) 》这本书学习的&#xff0c;已经是有5 6前年的样子了。当时觉得这本书写的非常通俗易懂是一本非常好的启蒙书籍&#xff0c;但是最近在翻阅的时…

jQuery 入门教程(5): 显示/隐藏内容

2019独角兽企业重金招聘Python工程师标准>>> jQuery的hide()和show()可以用来显示和隐藏内容。比如下面的例子&#xff1a;jQuery的hide()和show() 可以用来显示和隐藏内容。比如下面的例子&#xff1a; [html] view plain copy print ? <!doctype html> …

键盘键值表

键盘键值表 值 描述 0x1 鼠标左键 0x2 鼠标右键 0x3 CANCEL 键 0x4 鼠标中键 0x8 BACKSPACE 键 0x9 TAB 键 0xC CLEAR 键 0xD ENTER 键 0x10 SHIFT 键 0x11 CTRL 键 0x12 MENU 键 0x13 PAUSE 键 0x14 CAPS LOCK 键 0x1B ESC 键 0x20 SPACEBAR 键 0x21 PAGE UP 键 0x22 PAGE DOW…

Django QuerySet API文档

在查询时发生了什么(When QuerySets are evaluated) QuerySet 可以被构造&#xff0c;过滤&#xff0c;切片&#xff0c;做为参数传递&#xff0c;这些行为都不会对数据库进行操作。只要你查询的时候才真正的操作数据库。 下面的 QuerySet 行为会导致执行查询的操作&#xff1a…

Spring自动扫描配置及使用方法

2019独角兽企业重金招聘Python工程师标准>>> 首先&#xff0c;检查一下你lib下有没有 common-annotations.jar 这个jar包 没有的话要导入工程。 下一步配置spring的配置文件applicationContex.xml&#xff0c;加入命名空间 红色为需要添加的内容 <beans xmlns…

Linux下ln命令使用

n是linux中又一个非常重要命令&#xff0c;它的功能是为某一个文件在另外一个位置建立一个同步的链接.当我们需要在不同的目录&#xff0c;用到相同的文件时&#xff0c;我们不需要在每一个需要的目录下都放一个必须相同的文件&#xff0c;我们只要在某个固定的目录&#xff0c…

6面向对象的程序设计

ECMA_262把对象定义为&#xff1a;无序属性的集合&#xff0c;其属性可以包含基本值、对象或者函数。 6.1理解对象 特性&#xff08;attribute&#xff09;是内部值&#xff0c;描述了属性&#xff08;property&#xff09;的各种特性。ECMAScript中有两种属性&#xff1a;数据…

DPM 2012 SP1---安装并部署DPM 2012 SP1服务器

实验拓扑图&#xff1a;一、前提条件&#xff1a;需要在DPM2012 SP1服务器上完成以下操作&#xff1a;1.DPM服务器加入域&#xff08;使用域管理员登陆DPM2012 SP1服务器&#xff09;2.准备存储磁盘&#xff08;新添加一块硬盘&#xff09;3.关闭防火墙服务&#xff08;DPM服务…

Linux下tail命令使用

linux tail命令用途是依照要求将指定的文件的最后部分输出到标准设备&#xff0c;通常是终端&#xff0c;通俗讲来&#xff0c;就是把某个档案文件的最后几行显示到终端上&#xff0c;假设该档案有更新&#xff0c;tail会自己主动刷新&#xff0c;确保你看到最新的档案内容。 一…

城市编号(省和市)

备注&#xff1a;这里只是个人的观点&#xff0c;有的地方也是copy&#xff0c;多多指教&#xff0c;个人笔记&#xff0c;有侵犯你们版权的地方还望海涵&#xff01;&#xff01;&#xff01; "qq": [ { "describe_content": "省", "type&…

Linux下test命令使用

test命令格式&#xff1a; [cpp] view plain copy test condition 通常&#xff0c;在if-then-else语句中&#xff0c;用[]代替&#xff0c;即[ condition ]。注意&#xff1a;方括号两边都要用空格。 1、数值比较 比 较 描 述 ---------------------------------------…

用Mysql网页式管理工具安全地访问数据库的方法

2019独角兽企业重金招聘Python工程师标准>>> 用Mysql网页式管理工具安全地访问数据库的方法 在使用通达OA系统时很多用户需要借助Mysql网页式管理工具进入后台数据库去查看数据&#xff0c;进行一些相应的操作。但是大多数时候用户安装完该工具后都是直接进入后台数…

Shell 脚本编程之基础

最近闲着无聊&#xff0c;把笔记写在这吧 0x00 特殊符号和常见的运算符 <1>特殊符号 $*&#xff1a;命令行所有参数组成的字符串 $&#xff1a;命令行所有参数组成的字符串 $n&#xff1a;n位数字&#xff0c;$0表示命令名称&#xff0c;$1表示命令行第一个参数&#xff…

Linux 下的DMA浅析

DMA是一种无需CPU的参与就可以让外设和系统内存之间进行双向数据传输的硬件机制。使用DMA可以使系统CPU从实际的I/O数据传输过程中摆脱出来&#xff0c;从而大大提高系统的吞吐率。DMA经常与硬件体系结构特别是外设的总线技术密切相关。 一、DMA控制器硬件结构 DMA允许外围设备…