java学习笔记08--泛型
泛型可以解决数据类型的安全性问题,它主要的原理,是在类声明的时候通过一个标识标识类中某个属性的类型或者是某个方法的返回值及参数类型。这样在类声明或实例化的时候只要指定好需要的类型即可。
- class Point<T>{
- private T var; //var的类型由T决定 即由外包决定
- public T getVar() {
- return var;
- }
- public void setVar(T var) {
- this.var = var;
- }
- }
- public class T {
- public static void main(String[] args) {
- Point<String> p = new Point<String>(); //设置为String类型
- Point<Integer> p2 = new Point<Integer>(); //设置为Integer类型
- p.setVar("itmyhome");
- //p2.setVar("hello"); //p2设置为Integer类型 如果传入String类型就错误
- System.out.println(p.getVar());
- }
- }
构造方法中使用泛型
构造方法可以为类中的属性初始化,那么如果类中的属性通过泛型指定,而又需要通过构造设置属性内容的时候,那么构造方法的定义与之前并无不同,不需要像声明类那样指定泛型。
- class Point<T>{
- private T var; //var的类型由T决定 即由外包决定
- public Point(T var){
- this.var = var;
- }
- public T getVar() {
- return var;
- }
- public void setVar(T var) {
- this.var = var;
- }
- }
- public class T {
- public static void main(String[] args) {
- Point<String> p = new Point<String>("itmyhome"); //设置为String类型
- System.out.println(p.getVar());
- }
- }
设置多个泛型
- class Point<K,V>{
- private K key;
- private V value;
- public K getKey() {
- return key;
- }
- public void setKey(K key) {
- this.key = key;
- }
- public V getValue() {
- return value;
- }
- public void setValue(V value) {
- this.value = value;
- }
- }
- public class T {
- public static void main(String[] args) {
- Point<String,Integer> p = new Point<String,Integer>();
- p.setKey("itmyhome");
- p.setValue(23);
- System.out.println(p.getKey());
- System.out.println(p.getValue());
- }
- }
泛型的安全警告
通配符
匹配任意类型的通配符
在开发中对象的引用传递是最常见的,但是如果在泛型类的操作中,在进行引用传递的时候泛型类型必须匹配才可以传递,否则是无法传递的。
- class Info<T>{
- private T var;
- public T getVar() {
- return var;
- }
- public void setVar(T var) {
- this.var = var;
- }
- }
- public class T {
- public static void main(String[] args) {
- Info<String> info = new Info<String>(); //设置泛型类型为String
- info.setVar("itmyhome");
- <span style="color:#ff0000;">fun(info); </span>//此处无法传递类型不匹配
- }
- public static void fun(Info<Object> obj){ //接受Object泛型类型的info对象
- System.out.println(obj.getVar());
- }
- }
使用?通配符
- class Info<T>{
- private T var;
- public T getVar() {
- return var;
- }
- public void setVar(T var) {
- this.var = var;
- }
- }
- public class T {
- public static void main(String[] args) {
- Info<String> info = new Info<String>(); //设置泛型类型为String
- info.setVar("itmyhome");
- fun(info);
- }
- public static void fun(Info<?> obj){ //接受?泛型类型的info对象
- //obj.setVar("change"); //使用?只能接受 不可以修改
- System.out.println(obj.getVar());
- }
- }
如果使用?意味着可以接受任意的内容,但是此内容却无法直接使用<?>修饰的泛型对象进行修改。
受限泛型
之前设置泛型类型的时候,实际上都是可以任意设置的,只要是类就可以设置,但是在java的泛型中可以指定一个泛型的上限和下限
在引用传递中,泛型操作中也可以设置一个泛型对象的范围上限和范围下限。范围上限使用extends关键字声明,表示参数化的类型可能是所指定的类型,或者是此类型的子类,而范围下限使用super进行声明,表示参数化的类型可能是所指定的类型,或者是此类型的父类型,直至Object类。
设置上限
- class Info<T>{
- private T var;
- public T getVar() {
- return var;
- }
- public void setVar(T var) {
- this.var = var;
- }
- }
- public class T {
- public static void main(String[] args) {
- Info<Integer> info1 = new Info<Integer>();
- Info<Float> info2 = new Info<Float>();
- Info<String> info3 = new Info<String>(); //定义泛型类型为String
- info1.setVar(23);
- info2.setVar(50.0f);
- info3.setVar("itmyhome");
- fun(info1);
- fun(info2);
- fun(info3); //泛型上限设置为Number 无法进行传递
- }
- public static void fun(Info<? extends Number> obj){ //只能接受Number及其Number的子类
- System.out.println(obj.getVar());
- }
- }
设置下限
- class Info<T>{
- private T var;
- public T getVar() {
- return var;
- }
- public void setVar(T var) {
- this.var = var;
- }
- }
- public class T {
- public static void main(String[] args) {
- Info<String> info1 = new Info<String>();
- Info<Object> info2 = new Info<Object>();
- Info<Integer> info3 = new Info<Integer>();
- info1.setVar("itmyhome");
- info2.setVar("object");
- info3.setVar(23);
- fun(info1);
- fun(info2);
- fun(info3); //泛型下限受限 ,无法进行传递
- }
- public static void fun(Info<? super String> obj){ //只能接受String和Object类型的泛型
- System.out.println(obj.getVar());
- }
- }
解释:泛型与子类继承的限制
一个类的子类可以通过对象的多态性,为其父类实例化,但是在泛型操作中,子类的泛型类型是无法使用父类的泛型类型接受的,例如:Info<String>不能使用Info<Object>接受
泛型接口
之前的所有操作都是在类中直接使用泛型操作的,那么,对于java来说,也可以直接在接口中定义及使用泛型。
泛型接口实现的两种方式
定义子类,在子类的定义上也声明泛型类型
- interface Info<T>{ //在接口上定义泛型
- public T getVar(); //定义抽象方法 抽象方法的返回值就是泛型类型
- }
- class InfoImpl<T> implements Info<T>{ //定义泛型接口的子类
- private T var;
- public InfoImpl(T var){
- this.var = var;
- }
- public T getVar() {
- return var;
- }
- public void setVar(T var) {
- this.var = var;
- }
- }
- public class T {
- public static void main(String[] args) {
- Info<String> info = new InfoImpl<String>("itmyhome");
- System.out.println(info.getVar());
- }
- }
如果现在实现接口的子类不想使用泛型声明,则在实现接口的时候直接指定好操作的类型即可。
- interface Info<T>{ //在接口上定义泛型
- public T getVar(); //定义抽象方法 抽象方法的返回值就是泛型类型
- }
- class InfoImpl implements Info<String>{ //定义泛型接口的子类,直接指定类型
- private String var;
- public InfoImpl(String var){
- this.var = var;
- }
- public String getVar() {
- return var;
- }
- public void setVar(String var) {
- this.var = var;
- }
- }
- public class T {
- public static void main(String[] args) {
- Info info = new InfoImpl("itmyhome");
- System.out.println(info.getVar());
- }
- }
泛型方法
- class Demo{
- public<T> T fun(T var){
- return var;
- }
- }
- public class T {
- public static void main(String[] args) {
- Demo d1 = new Demo();
- Demo d2 = new Demo();
- System.out.println(d1.fun("itmyhome"));
- System.out.println(d2.fun(23));
- }
- }
java学习笔记08--泛型的更多相关文章
- 【原】Java学习笔记027 - 泛型
package cn.temptation.test; import java.util.ArrayList; import java.util.Iterator; public class Samp ...
- 【Java学习笔记】泛型
泛型: jdk1.5出现的安全机制 好处: 1.将运行时期的问题ClassCastException转到了编译时期. 2.避免了强制转换的麻烦. <>: 什么时候用? 当操作的引用数据类型 ...
- java学习笔记之泛型
"泛型"这个术语的意思就是:"使用与许多许多的类型".泛型在编程语言中出现时,其最初的目的是希望类或方法能够具备最广泛的表达能力.如何做到这一点呢,正是通过解耦 ...
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
- Java学习笔记4
Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...
- java学习笔记10--枚举
java学习笔记10--枚举 在JDK1.5之前,java可以有两种方式定义新类型:类和接口.对于大部分面向对 象编程来说,这两种方法看起来似乎足够了,但是在一些特殊情况下,这些方法就不适合.例如,想 ...
- JAVA自学笔记08
JAVA自学笔记08 1.构造方法私有,外界就不能再创建对象 2.说明书的制作过程 1)写一个工具类,在同一文件夹下,测试类需要用到工具类,系统将自动编译工具类:工具类的成员方法一般是静态的,因此在测 ...
- java学习笔记10--泛型总结
java学习笔记系列: java学习笔记9--内部类总结 java学习笔记8--接口总结 java学习笔记7--抽象类与抽象方法 java学习笔记6--类的继承.Object类 java学习笔记5-- ...
- 20145230《java学习笔记》第九周学习总结
20145230 <Java程序设计>第9周学习总结 教材学习内容 JDBC JDBC简介 JDBC是用于执行SQL的解决方案,开发人员使用JDBC的标准接口,数据库厂商则对接口进行操作, ...
随机推荐
- 《C语言深度解剖》面试题整理
请在40分钟内完成以下20道C语言基础题.在没有任何提示的情况下,如果能得满分,那么你可以扔掉本书了,你的水平已经大大超过了作者:如果能的80分以上,说明你的C语言基础还不错,学习本书可能会比较轻松: ...
- mpi中利用自定义归约操作实现merge
在归并排序中,很重要的一步是将两个排序数组合并成一个数组,这个操作叫merge.merge操作可以用来解决某些Top K问题. 问题描述 在哼唱搜索中,用户通过哼唱一个音乐片段去搜索与其相似的音乐.后 ...
- 令牌桶在数据通信QoS流量监管中的应用
令牌桶(Tocken Bucket,以下简称TB)在流量监管(以下简称CAR)功能中完成对流量进行限速的作用.流量监管主要是应用与网络边缘,从而保证核心设备的正常数据处理. 在流量监管的处理过程中,首 ...
- meanShift算法介绍
meanShift,均值漂移,在聚类.图像平滑.切割.跟踪等方面有着广泛的应用.meanShift这个概念最早是由Fukunage在1975年提出的,其最初的含义正如其名:偏移的均值向量:但随着理论的 ...
- 总线接口与计算机通信(一)I2C总线
1. I2C总线的基本概念 1)发送器(Transmitter):发送数据到总线的器件 2)接收器(Receiver):从总线接收数据的器件 3)主机(Master):初始化发送. ...
- ean128与code128 条形码 算法分析
[code128条形码组成] 除终止符(STOP)由13个模块组成外,其他字符均由11个模块组成 就是说,如果用‘1’表示黑线(实模块),用‘0’表示白线(空模块),那么每表示一个字符就需要11条线, ...
- 基于visual Studio2013解决面试题之1202最大公共字符串
题目
- iPhone5C三大看点:性能不输iPhone5 或售3399元
乐杨俊编辑修改转载: iPhone 5C的发售时间或最早在9月18日,抢在中秋节前:最迟至国庆十一假期期间. [IT商业新闻网综合讯](记者 林涛)苹果2013年秋季发布会还有几个小时即将开幕,除了i ...
- python datetime模块strptime/strptime format常见格式命令_施罗德_新浪博客
python datetime模块strptime/strptime format常见格式命令_施罗德_新浪博客 python datetime模块strptime/strptime form ...
- paip.php 配置ZEND DEBUGGER 断点调试for cli..
paip.php 配置ZENDDEBUGGER 断点调试for cli.. 作者Attilax , EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http:/ ...