泛型(Java 5 开始)
前言
Java 5 开始之前,从集合读取的数据都必须进行类型转换,如果插入错误的数据就会报错。
有了泛型,编译器会自动为你的插入进行转换,并在插入时告知是否插入了类型错误的对象。
将类型由原来的具体的类型参数化(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。
泛型只在编译阶段有效(泛型擦除)。
泛型有三种使用方式,分别为:泛型类、泛型接口、泛型方法。
分类
泛型类:
public class Generic<T> //最典型的就是各种容器类,如:List、Set、Map。
泛型接口:
public interface Generator<T> //泛型接口常被用在各种类的生产器中
泛型方法:
public <T,K> K showKeyName(Generic<T> container) //<T,K>必不可少,表明这是一个泛型方法
注:如果在泛型类中定义使用静态泛型方法,需要在静态泛型方法上添加额外的泛型声明,
即使静态方法要使用泛型类中已经声明过的泛型也不可以。
泛型上下边界(参数化类型是不可变的,所有需要泛型通配符):
Generic<?> obj //可以接受任何类型作为泛型传入
Generic<? extends Number> obj //只能传入number的子类或者number
Generic<? super Integer> obj //只能传入Integer的父类或者Integer
面试汇总
泛型的作用:
在集合中存储对象并在使用前进行类型转换不方便。
泛型防止了那种情况的发生。
它提供了编译期的类型安全,确保你只能把正确类型的对象放入集合中,避免了在运行时出现ClassCastException。
Java的泛型是如何工作的?什么是类型擦除:
有了泛型,编译器会自动为你的插入进行转换,并在插入时告知是否插入了类型错误的对象。
泛型是通过类型擦除来实现的,编译器在编译时擦除了所有类型相关的信息,所以在运行时不存在任何类型相关的信息。
例如 List 在运行时仅用一个 List 来表示。这样做的目的是确保能和 Java 5 之前的版本开发二进制类库进行兼容。
你无法在运行时访问到类型参数。
擦除使泛型可以与没有使用泛型的代码随意互用。
泛型(Java 5 开始)的更多相关文章
- Java 泛型 Java使用泛型的意义
Java 泛型 Java使用泛型的意义 @author ixenos 直接意义 在编译时保证类型安全 根本意义 a) 类型安全问题源自可复用性代码的设计,泛型保证了类型安全的复用模板 b) 使用复用性 ...
- 【原】泛型-Java
泛型是Java SE5.0中新增的新特性,通过泛型使得在代码编译的时候就能检查类型安全,并且所有的强制类型转换都是自动和隐式的,从而提高代码的重用率. Note:在JavaSE7+以后的版本中,构造函 ...
- Java中的泛型 --- Java 编程思想
前言 我一直都认为泛型是程序语言设计中一个非常基础,重要的概念,Java 中的泛型到底是怎么样的,为什么会有泛型,泛型怎么发展出来的.通透理解泛型是学好基础里面中非常重要的.于是,我对<Ja ...
- C++泛型 && Java泛型实现机制
C++泛型 C++泛型跟虚函数的运行时多态机制不同,泛型支持的静态多态,当类型信息可得的时候,利用编译期多态能够获得最大的效率和灵活性.当具体的类型信息不可得,就必须诉诸运行期多态了,即虚函数支持的 ...
- 一起学 Java(三) 集合框架、数据结构、泛型
一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...
- Java泛型学习笔记 - (三)泛型方法
泛型方法其实和泛型类差不多, 就是把泛型定义在方法上, 格式大概就是: public <类型参数> 返回类型 方法名(泛型类型 变量名) {...}泛型方法又分为动态方法和静态方法,:1. ...
- Java泛型-类型擦除
一.概述 Java泛型在使用过程有诸多的问题,如不存在List<String>.class, List<Integer>不能赋值给List<Number>(不可协变 ...
- Java学习笔记(二一)——Java 泛型
[前面的话] 最近脸好干,掉皮,需要买点化妆品了. Java泛型好好学习一下. [定义] 一.泛型的定义主要有以下两种: 在程序编码中一些包含类型参数的类型,也就是说泛型的参数只可以代表类,不能代表个 ...
- Java编程思想学习(十一) 泛型
1.概要 generics enable types (classes and interfaces) to be parameters when defining classes, interfac ...
- Java核心 --- 泛型
CoreJava 泛型 java泛型的出现避免了强制类型转换,便于代码更好的被阅读 本文的写作参照了张孝祥的泛型介绍:http://www.itcast.cn/news/dbfd20f1/f4b1/4 ...
随机推荐
- ERROR 2003 (HY000): Can't connect to MySQL server on '129.28.149.240' (111) mysql 无法远程连接
环境: ubuntu mysql 一. 查看端口 可以看到mysql监控的是本机Ip root@jiang:/etc/mysql/mysql.conf.d# netstat -apn|grep 33 ...
- Cesium经纬度
computed: { handler() { return new this.Cesium.ScreenSpaceEventHandler(this.viewer.scene.canvas) } } ...
- STM点滴一
就就是你用BSRR和BRR去改变管脚状态的时候,没有被中断打断的风险.也就不需要关闭中断. This way, there is no risk that an IRQ occurs between ...
- 【原理】scan
SCAN 命令的保证(guarantees) 同一个元素可能会被返回多次. 处理重复元素的工作交由应用程序负责, 比如说, 可以考虑将迭代返回的元素仅仅用于可以安全地重复执行多次的操作上. 如果一个元 ...
- SCP-bzoj-1090
项目编号:bzoj-1090 项目等级:Safe 项目描述: 戳这里 特殊收容措施: 区间DP.设计状态f[i][j]表示压缩从第i位到第j位的字符串所需的最小长度.转移方式有三种: •初始化:j-i ...
- paper 143:人脸验证
持续更新ing,敬请期待! 参考:http://blog.csdn.net/stdcoutzyx/article/details/42091205 1. DeepID人脸识别算法 香港中文大学的团队 ...
- JMeter 阶梯式加压测试插件 Stepping Thread Group
在日常性能测试过程中,有时需要对被测对象不断的增加压力,直至达到某个值后,并持续运行一段时间.这里将借助jmeter插件模拟这种情况. 本文介绍在jmeter中,使用插件Stepping Thread ...
- 探索Redis设计与实现12:浅析Redis主从复制
本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...
- mysql全家桶(二)数据操作
一.数据操作1.增#新增insert into 表名(字段列表) values(值列表);INSERT INTO table_name ( field1, field2,...fieldN ) VAL ...
- cassandra百亿级数据库迁移实践
迁移背景 cassandra集群隔段时间出现rt飙高的问题,带来的影响就是请求cassandra短时间内出现大量超时,这个问题发生已经达到了平均两周一次的频率,已经影响到正常业务了.而出现这些问题的原 ...