Java学习笔记(43)——Java泛型
为什么80%的码农都做不了架构师?>>>
其实Java的泛型和C#的泛型是一样的道理,说白了就是“类型参数化”,没什么神秘的,所以这篇就说说Java泛型的一些事!
一、泛型的好处
避免拆装箱,提高程序性能
复用代码
类型安全
二、泛型类
[访问修饰符] class 类名<泛型1,泛型2,…> {泛型1 泛型成员1;泛型2 泛型成员2; //....}
//此处声明了一个包含泛型T的泛型类,T代表所有可能的类型,而T的实际类型在Generic类实例化时指定。class Generic<T> { private T f; //f为泛型成员public void setF(T f) {//setF方法的参数类型为泛型Tthis.f = f;} public T getF() {//getF方法的返回类型为泛型Treturn f;}
}
三、泛型接口
interface Info<T>{ // 在接口上定义泛型 public T getVar() ; // 定义抽象方法,抽象方法的返回值就是泛型类型
}
class InfoImpl<T> implements Info<T>{ // 定义泛型接口的子类 private T var ; // 定义属性 public InfoImpl(T var){ // 通过构造方法设置属性内容 this.setVar(var) ; } public void setVar(T var){ this.var = var ; } public T getVar(){ return this.var ; }
};
public class GenericsDemo24{ public static void main(String arsg[]){ Info<String> i = null; // 声明接口对象 i = new InfoImpl<String>("汤姆") ; // 通过子类实例化对象 System.out.println("内容:" + i.getVar()) ; }
};
四、泛型方法
class Demo{ public <T> T fun(T t){ // 可以接收任意类型的数据 return t ; // 直接把参数返回 }
};
public class GenericsDemo26{ public static void main(String args[]){ Demo d = new Demo() ; // 实例化Demo对象 String str = d.fun("汤姆") ; // 传递字符串 int i = d.fun(30) ; // 传递数字,自动装箱 System.out.println(str) ; // 输出内容 System.out.println(i) ; // 输出内容 }
};
五、泛型通配符
非受限通配:? (它和? extends Object是一样的):适配所有的类型
受限通配:? extends T (表示T或T的一个未知子类型):限定通配符匹配类型的上限
下限通配: ? super T (表示T或T的一个未知父类型):限定通配符匹配类型的下限
注意:
多接口限制
虽然Java泛型简单的用 extends 统一的表示了原有的 extends 和 implements 的概念,但仍要遵循应用的体系,Java 只能继承一个类,但可以实现多个接口,所以你的某个类型需要用 extends 限定,且有多种类型的时候,只能存在一个是类,并且类写在第一位,接口列在后面,也就是:<T extends SomeClass & interface1 & interface2 & interface3>
这里的例子仅演示了泛型方法的类型限定,对于泛型类中类型参数的限制用完全一样的规则,只是加在类声明的头部,如:
public class Demo<T extends Comparable & Serializable>{ //T类型就可以用Comparable声明的方法和Seriablizable所拥有的特性了}
六、泛型擦除
在JAVA的虚拟机中并不存在泛型,泛型只是为了完善java体系,增加程序员编程的便捷性以及安全性而创建的一种机制,在JAVA虚拟机中对应泛型的都是确定的类型,在编写泛型代码后,java虚拟中会把这些泛型参数类型都擦除,用相应的确定类型来代替,代替的这一动作叫做类型擦除,而用于替代的类型称为原始类型,在类型擦除过程中,一般使用第一个限定的类型来替换,若无限定则使用Object.
泛型类(不带泛型限定)代码:
class Test<T>{ private T t; public void show(T t){}
}
虚拟机进行翻译后的原始类型:
class Test
{private Object t;public void show(Object t){}
}
转载于:https://my.oschina.net/jewill/blog/412182
Java学习笔记(43)——Java泛型相关推荐
- Java学习笔记1:Java中有关print、println、printf的用法和区别
Java学习笔记1:Java中有关print.println.printf的用法和区别 最近在学习java,写一些笔记记录下. 1.print()函数是一般的标准输出,但是不换行. 2.println ...
- Java学习笔记(java基础)
Java学习笔记(第一周) Java 介绍 Java 发展方向 JVM , JDK , JRE 名词解释 Java语言的特点 Java安装 安装包的下载 配置环境变量 验证是否安装成功 Java的第一 ...
- 泛型java实例_【Java学习笔记】Java6泛型实例
你若是不使用泛型,则会这样处理数据类型不确定的问题: class Stash { private Object x; void set(Object x) { this.x = x; } Object ...
- 【java】java学习笔记之java oop(面向对象)
如下图所示为笔者总结的java oop(面向对象)学习笔记,其中,附带有代码示例(未展开),方便理解记忆.需要源文件的请到我的资源中下载,下载地址:https://download.csdn.net/ ...
- 【java】java学习笔记之java常用类
如下图所示为笔者总结的java常用类学习笔记,其中,附带有代码示例(未展开),方便理解记忆.需要源文件的请到我的资源中下载,下载地址:https://download.csdn.net/downloa ...
- Java学习笔记 - 4 Java核心类库
4 Java 核心类库 4.1 泛型 泛型,即"参数化类型".就是将原来具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时 ...
- Java 学习笔记(4)——java 常见类
上次提前说了java中的面向对象,主要是为了使用这些常见类做打算,毕竟Java中一切都是对象,要使用一些系统提供的功能必须得通过类对象调用方法.其实Java相比于C来说强大的另一个原因是Java中提供 ...
- java学习笔记(一) ----java下常用的包功能
***java下常用的包*** java.lang----包含一些java语言的核心类,如String,Math,Integer,System,Thread,提供常用的功能. java.awt---- ...
- Java学习笔记-7.Java IO流
一.输入/输出流 1.流:不同类型的输入.输出源 数据流:输入或输出的数据 Java数据流的所有接口和类都是在java.io包中定义的,因此应在程序开头加入 import java.io.* 2 ...
- JAVA学习笔记 03 - JAVA语言程序结构
本文是Java基础课程的第三课.计算机语言的程序结构无外乎顺序结构.分支结构.循环结构,本文主要介绍Java语言中这些程序结构是如何实现的 文章目录 一.程序结构 二.分支结构 1.单分支if语句 2 ...
最新文章
- Redis 笔记(02)— keys 键相关命令(查询数据库key数量、判断key是否存在、指定key过期时间、查看key类型、查看key剩余秒数、选择数据库、删除key、删除数据库)
- 您必须在sources.list中指定代码源_python如何从源代码构建lxml
- rust(60)-opencv(1)
- SAP Spartacus的OccCmsPageNormalizer
- Python 函数的参数形式
- python是什么课程-python是什么(python是什么课程)
- 虚拟机卡在登录界面卡住了_手机都10核了 为何还是照样卡?
- Informatic学习总结_day03_update组件学习
- 【Java】Response约定
- 理解Window和WindowManager
- 手把手教你搭建Windows环境微信小程序的本地测试服务器
- Connection could not be established with host smtp.163.com 阿星小栈
- 第3章 内核编程语言与环境(2)
- php导出excel失败原因,PHPExcel中导出Excel出错的一种可能原因
- OSChina 周二乱弹 —— 对!公交车绝缘体
- opencv实现色彩还原(白平衡)
- 消息队列中间件 Message Queue 简称:MQ
- Git 报错:fatal: destination path ‘.‘ already exists and is not an empty directory.
- 专业的人脸拼接工具:Morph Age mac版
- 《区块链革命》读书笔记 8 克服困难:实施过程中的10个挑战
热门文章
- Java中获取路径的各种方法
- CISCO PIX/ASA Failover 技术初步学习
- 计算机维护方面的知识和技巧,电脑硬件维护常识和方法【图文详解】
- 如何恢复隐藏的窗口 已知进程名称_如何判断Linux系统是否被黑客入侵?可以用这种方法...
- er图转为数据流程图_draw.io for Mac(流程图绘制工具)
- mfc让图片与按钮一起_微信朋友圈发图片还能添加语音,简单两步就能搞定!今天学到了...
- python足球联赛赛程_python爬取足球比赛赛程笔记
- python爬取微博指定内容_python3.5爬虫-爬取微博某博主微博内容
- native react ssh_React Native踩坑笔记(持续更新中...)
- jeesite如何已生成数据的数据源_jeesite1.X 集成多数据源