Java基础一篇过(二)泛型
一、啥是泛型
概述
泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,即所操作的数据类型被指定为一个参数。
格式
类名<类型名>
标记符
- E - Element (在集合中使用,因为集合中存放的是元素)
- T - Type(Java 类)
- K - Key(键)
- V - Value(值)
- N - Number(数值)
- ? - 表示不确定的java类型(通配符)
- S、U、V、 - 用在第2、3、4个参数类型时使用
二、代码走一波
汽车类
/**
* 汽车类
*/
@Data
public class Car {
/*无参构造*/
public Car() { } /*带参构造*/
public Car(int id, String name, String Type) {
this.id = id;
this.name = name;
this.Type = Type;
} /*属性*/
private int id;//编号
private String name;//名称
private String Type;//类型
}
猫猫类
/**
* 宠物类
*/
@Data
public class Pet {
/*无参构造*/
public Pet() { } /*带参构造*/
public Pet(int id, String name, String Type) {
this.id = id;
this.name = name;
this.Type = Type;
} /*属性*/
private int id;//编号
private String name;//名称
private String Type;//类型
}
泛型类
/**
* 泛型测试类
*
* @param <T> 参数1(泛型对象)
* @param <S> 参数2(继承Pet类的泛型对象)
*/
@Data
public class User<T, S extends Pet> {
/*带参构造*/
public User(int id, String name, String Type, List<T> t, List<S> s) {
this.id = id;
this.name = name;
this.Type = Type;
this.tList = t;
this.sList = s;
} /*泛型属性*/
private List<T> tList;//泛型List
private List<S> sList;//继承Pet类的泛型List /*一般属性*/
private int id;//编号
private String name;//名称
private String Type;//类型 /*重写toString()方法*/
@Override
public String toString() {
String msg = "id为【%s】的【%s】用户【%s】拥有猫猫【%s】和汽车【%s】";
return String.format(msg, this.id, this.Type, this.name, this.sList.toString(), this.tList.toString());
}
}
测试类
/**
* 测试类
*/
public class Test {
public static void main(String args[]) {
List<Pet> petList = new ArrayList<Pet>();
petList.add(new Pet(1, "汤圆", "英短"));
petList.add(new Pet(2, "糯米", "英短"));
petList.add(new Pet(3, "咖喱", "田园")); List<Car> carList = new ArrayList<Car>();
carList.add(new Car(1, "标志", "小轿车"));
carList.add(new Car(2, "哈弗", "SUV")); User user = new User(1, "ZH", "男性", carList, petList);//第5个参数如果不是一个继承了Pet类的List,则编译会报错
System.out.println(user.toString());
}
}
输出
小结
我们知道Object类是所有类的父类,在引入泛型概念之前,我们常用Object的引用来实现参数的“任意化”。
痛点:
- 要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。
- 对于强制类型转换错误的情况 ,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。
泛型的好处:
- 通过IDE进行代码类型初步检查,然后在编译阶段进行编译类型检查,避免运行时异常,以保证类型转换的安全性。
- 所有的强制转换都是自动和隐式的,可以提高代码的重用率。
Java基础一篇过(二)泛型的更多相关文章
- JAVA基础再回首(二十五)——Lock锁的使用、死锁问题、多线程生产者和消费者、线程池、匿名内部类使用多线程、定时器、面试题
JAVA基础再回首(二十五)--Lock锁的使用.死锁问题.多线程生产者和消费者.线程池.匿名内部类使用多线程.定时器.面试题 版权声明:转载必须注明本文转自程序猿杜鹏程的博客:http://blog ...
- java基础-引用数据类型之二维数组(Array)
java基础-引用数据类型之二维数组(Array) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 之前我们学习过了Java的一维数组,所谓的二维数组就是元素是一堆一维数组的数组,换 ...
- Java 基础(一)| 使用泛型的正确姿势
前言 为跳槽面试做准备,今天开始进入 Java 基础的复习.希望基础不好的同学看完这篇文章,能掌握泛型,而基础好的同学权当复习,希望看完这篇文章能够起一点你的青涩记忆. 一.什么是泛型 泛型,即&qu ...
- java基础知识一览(二)
一.java基础知识 1.一个文件中只能有一个public的类,因为他的类名要求和文件名相同. 2.classpath变量可以设置其它目录下的类. 例如:类文件所在目录是:F:\Javajdk,那么没 ...
- java基础——入门篇
整体大纲图 1.认识java 核心知识点:JVM.搭建Java开发环境.java的发展史.java特点.java程序类型.垃圾收集器.J2SE下载和安装.环境变量的配置和测试.以及简单的开发工具的使用 ...
- JAVA基础——编程练习(二)
JAVA编程练习(二) 今天我为了巩固之前的java基础知识的学习,再次进行实战演习,编写了一个小小的java控制台程序,主要是运用java面向对象的思想来完成这个小项目. 一.项目背景介绍 根据所学 ...
- java基础梳理--朝花夕拾(二)
1.Java语言语法规则和文件格式: 第一个Java程序:/** 第一个Java程序:控制台输出Hello world!*/public class Test{ //访问修饰符 class关键词 ...
- JS基础入门篇(二十七)—BOM
虽然上次写到js基础篇(二十四),这次直接写到(二十七).是为了提醒自己中间有几篇没写.特此说明一下啊. 1.window.open() 使用a标签呢,点击一下a标签页面才会跳转,有时候我们需要做的操 ...
- 夯实Java基础(十八)——泛型
1.什么是泛型 泛型是Java1.5中出现的新特性,也是最重要的一个特性.泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类. ...
- Java基础学习总结(二)
Java语言的特点: Java语言是简单的 Java语言是面向对象的 Java语言是跨平台(操作系统)的(即一次编写,到处运行) Java是高性能的 运行Java程序要安装和配置JDK jdk是什么? ...
随机推荐
- Solon详解(五)- Solon扩展机制之Solon Plugin
Solon 中也有一种非常解耦的扩展机制:Solon Plugin.这种扩展机制和Spring Factories很像,和SPI也很像. 一.Solon 中的扩展机制 在Solon的扩展插件加载机制, ...
- 第3篇 Scrum 冲刺博客(专✌️团队)
目录 一.站立式会议 1.1 会议照片 1.2 成员完成情况 二.项目燃尽图 三.成员代码/文档签入记录 3.1 代码签入 3.2 Issue链接 3.3 CodeReview代码规范文档 四.最新项 ...
- Flying Pages:在单击之前预加载页面,打开网页快得飞起
Flying Pages能够实现:在用户点击网页的链接之前,就预加载这个网页,当再点击这个网页时,页面便能飞速打开,能为网站优化加分.接下来,就由LOYSEO来讲解Flying Pages的使用方法. ...
- 跟我一起学.NetCore之日志作用域及第三方日志框架扩展
前言 上一节对日志的部分核心类型进行简单的剖析,相信现在再使用日志的时候,应该大概知道怎么一回事了,比如记录器是怎么来的,是如何将日志内容写入到不同目的地的等:当然还有很多细节没深入讲解,抽时间小伙伴 ...
- Python 到底是强类型语言,还是弱类型语言?
0.前言 我在上一篇文章中分析了 为什么 Python 没有 void 类型 的话题,在文章发布后,有读者跟我讨论起了另一个关于类型的问题,但是,我们很快就出现了重大分歧. 我们主要的分歧就在于:Py ...
- HMM隐马尔可夫模型来龙去脉(二)
目录 前言 预备知识 一.估计问题 1.问题推导 2.前向算法/后向算法 二.序列问题 1.问题推导 2.维特比算法 三.参数估计问题 1.问题推导 2.期望最大化算法(前向后向算法) 总结 前言 H ...
- Eazfuscator.net 2020 虚拟化保护(Virtulization)机制分析
一.前言与目标 周末接触了一款游戏They are billons即亿万僵尸,想添加一些新的玩法元素比如新的兵种进去, 打开dnspy看了下,发现是Eazfuscator.net的Virtulizat ...
- 最佳实践:Pulsar 为批流处理提供融合存储
非常荣幸有机会和大家分享一下 Apache Pulsar 怎样为批流处理提供融合的存储.希望今天的分享对做大数据处理的同学能有帮助和启发. 这次分享,主要分为四个部分: 介绍与其他消息系统相比, Ap ...
- 热更新 && 增量更新
Unity中SLua.Tolua.XLua和ILRuntime效率评测 http://blog.csdn.net/u011467512/article/details/72716376 如何阅读lua ...
- C++从LPEXCEPTION_POINTERS获取调用堆栈
#pragma once #include <map> #include <vector> struct FunctionCall { DWORD64 Address; std ...
