Java基础 —— 泛型
泛型
泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。
理解
为了可以进一步理解泛型,我们先来看一个问题
需求:
编写一个程序,在ArrayList中添加三个对象,类中要有name、age属性,输出对象的name、age属性
- 首先,我们先用传统方法进行编写
package com.sxny;
import java.util.ArrayList;
public class text {
public static void main(String[] args) {
ArrayList arrayList = new ArrayList();
arrayList.add(new Person("王五",55));
arrayList.add(new Person("李四",12));
arrayList.add(new Person("王五",8));
arrayList.add(new Animal("奶盖",2));
for (Object o:arrayList){ //增强for循环
Person person = (Person)o;
System.out.println(person);
}
}
}
class Person{
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
class Animal{
private String name;
private int age;
public Animal(String name,int age){
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Animal{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}

从上图我们可以看到,用传统方法,会出现ClassCastException异常, 其原因主要是传统方法中,需要进行类型的转换。Person在进入Arraylist中时会转换成Object类型,在取出时又会转回Person类型。
- 针对以上问题,现在我们利用泛型来解决
package com.sxny;
import java.util.ArrayList;
public class text {
public static void main(String[] args) {
ArrayList<Person> arrayList = new ArrayList<Person>();
arrayList.add(new Person("王五",55));
arrayList.add(new Person("李四",12));
arrayList.add(new Person("王五",8));
// arrayList.add(new Animal("奶盖",2));
for (Object o:arrayList){ //增强for循环
Person person = (Person)o;
System.out.println(person);
}
}
}
class Person{
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
class Animal{
private String name;
private int age;
public Animal(String name,int age){
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Animal{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}

在创建Arraylist时限制了添加元素的类型, Arraylist arraylist = new Arraylist()若发现类型不符合,则会报错,并且在遍历时无需类型的转换,因此,解决了ClassCastException异常的问题。
使用泛型的好处
- 编译时,检查添加的元素,增加了安全性。
- 无需数据类型的转换,提高了效率。
- 不再提示警告。
类通配符
通常类通配符使用 ?代替具体的类型参数。例如,List<?>逻辑上是List<Integer>、List<String>等所有List<类型>的父类。
Java基础 —— 泛型的更多相关文章
- 一天一个Java基础——泛型
这学期的新课——设计模式,由我仰慕已久的老师传授,可惜思维过快,第一节就被老师挑中上去敲代码,自此在心里烙下了阴影,都是Java基础欠下的债 这学期的新课——算法设计与分析,虽老师不爱与同学互动式的讲 ...
- Java 基础 -- 泛型、集合、IO、反射
package com.java.map.test; import java.util.ArrayList; import java.util.Collection; import java.util ...
- java基础-泛型举例详解
泛型 泛型是JDK5.0增加的新特性,泛型的本质是参数化类型,即所操作的数据类型被指定为一个参数.这种类型参数可以在类.接口.和方法的创建中,分别被称为泛型类.泛型接口.泛型方法. 一.认识泛型 在没 ...
- Java基础 - 泛型详解
2022-03-24 09:55:06 @GhostFace 泛型 什么是泛型? 来自博客 Java泛型这个特性是从JDK 1.5才开始加入的,因此为了兼容之前的版本,Java泛型的实现采取了&quo ...
- java基础-泛型3
浏览以下内容前,请点击并阅读 声明 8 类型擦除 为实现泛型,java编译器进行如下操作进行类型擦除: 如果类型参数有限制则替换为限制的类型,如果没有则替换为Object类,变成普通的类,接口和方法. ...
- java基础 泛型
泛型的存在,是为了使用不确定的类型. 为什么有泛型? 1. 为了提高安全 2. 提高代码的重用率 (自动 装箱,拆箱功能) 一切好处看代码: package test1; import java.la ...
- java基础-泛型2
浏览以下内容前,请点击并阅读 声明 6 类型推测 java编译器能够检查所有的方法调用和对应的声明来决定类型的实参,即类型推测,类型的推测算法推测满足所有参数的最具体类型,如下例所示: //泛型方法的 ...
- java基础-泛型1
浏览以下内容前,请点击并阅读 声明 泛型的使用能使类型名称作为类或者接口定义中的参数,就像一般的参数一样,使得定义的类型通用性更强. 泛型的优势: 编译具有严格的类型检查 java编译器对于泛型代码的 ...
- Java基础---泛型、集合框架工具类:collections和Arrays
第一讲 泛型(Generic) 一.概述 1.JDK1.5版本以后出现的新特性.用于解决安全问题,是一个类型安全机制. 2.JDK1.5的集合类希望在定义集合时,明确表明你要向集合中装入那种类 ...
- Java基础——泛型
一.定义 泛型(generic)是指参数化类型的能力.可以定义带泛型类型的类或方法,随后编译器会用具体的类型来替换它(泛型实例化).使用泛型的主要优点是能够在编译时,而不是在运行时检测出错误.它是jd ...
随机推荐
- Google Analytics & Ads 学习笔记 2 (gtag 版本)
gtag 是用来取代之前的 ga 的 但其实它底层就是调用 ga 而已. 只是封装了一个上层. 1. start up script <script async src="https: ...
- ASP.NET Core – 读写 Request / Response
需求 常见的需求就是从 request 里面读取一些 information. 比如 request URL, header, cookie, 写入 response header, cookie 实 ...
- el-table
el-table-column 渲染的顺序不对,第一列被渲染到最后 el-table-column 必须作为 el-table 或 el-table-column 的直接子元素使用,如果不是将会导致标 ...
- 使用Minio Clinet将老版本Minio的数据迁移到新版本的Minio
1. 关于Minio Client: MinIO Client是一个命令行工具,用于与Minio或云存储服务进行交互.它支持文件系统和Amazon S3兼容的云存储服务(AWS Signature v ...
- Flutter Engage 活动精彩回顾 | 中文字幕视频
在 Flutter Engage 预告之后,无数开发者充满期待并且在社区中积极讨论交流,分享见解.今天,我们正式发布 Flutter 2.0,并在 Flutter Engage 活动 中详细介绍了这一 ...
- [Tkey] OSU!
更新的题解可看 此处 你说得对但是 恐怖日本病毒会自动向你的电脑中下载 OSU! 题意简述 一个 01 串,每个位置有 \(p_{i}\) 的概率为 \(1\),连续的 \(x\) 个 \(1\) 贡 ...
- markdown公式关系符
- Windows应急响应-QQ巨盗病毒
目录 病毒背景 样本分析 开启监控 感染病毒 分析病毒行为 C盘文件监控 D盘文件监控 进程监控排查 服务排查 启动项排查 查杀 1.杀掉进程 2.异常服务 3.映像劫持处理 4.hosts文件处理 ...
- 【USB3.0协议学习】Topic1·USB3.0Hub的一些机制
一.USB3.0 Hub的单播(非广播)机制 Hub通过解析下行packet header中的Route String字段识别packet要传递的终点,其中4'b0000代表hub本身,4'b0001 ...
- Android Qcom USB Driver学习(六)
眼图基础知识与详解 10分钟教会你看眼图 USB2.0 HUB眼图调试经验总结 一篇文章教你如何全面了解眼图测试! 预加重与去加重对眼图的影响 关于 USB 通信阻抗匹配的问题 硬件调试--眼图几个经 ...