java的泛型你真的了解吗
作者:White?Code 发布时间:2022-07-25 09:40:06
标签:java,泛型
泛型的概述和优势
泛型概述
泛型:是JDK5中引入的特性,可以在编译阶段约束操作的数据类型,并进行检查。
泛型的格式:<数据类型>; 注意:泛型只能支持引用数据类型。
集合体系的全部接口和实现类都是支持泛型的使用的。
泛型的好处:
统一数据类型。
把运行时期的问题提前到了编译期间,避免了强制类型转换可能出现的异常,因为编译阶段类型就能确定下来。
泛型可以在很多地方进行定义:
类后面 --> 泛型类
方法申明上 --> 泛型方法
接口后面 --> 泛型接口
自定义泛型类
泛型类的概述
定义类时同时定义了 泛型的类 就是 泛型类。
泛型类的格式:修饰符 class 类名<泛型变量(只能是引用类型)>{ }
范例:public class MyArrayList<T> { }
此处泛型变量T可以随便写为任意标识,常见的如E、T、K、V等。
作用:编译阶段可以指 定数据类型**(必须是引用类型)**,类似于集合的作用。
课程案例导学
模拟ArrayList集合自定义一个集合MyArrayList集合,完成添加和删除功能的泛型设计即可。
问题1:泛型类的核心思想?
把出现泛型变量的地方全部替换成传输的真实数据类型
问题2:泛型类的作用?
编译阶段约定操作的数据的类型,类似于集合的作用。
自定义泛型方法
泛型方法的概述
定义方法时同时定义了 泛型的方法 就是 泛型方法。
泛型方法的格式:修饰符 <泛型变量> 方法返回值 方法名称(形参列表){}
范例: public <T> void show(T t) { // <T>表示参数的类型,一般在public或者static的后面
}
作用:方法中可以使用泛型接收一切实际类型的参数,方法更具备通用性。
课程案例导学
给你任何一个类型的数组,都能返回它的内容。也就是实现Arrays.toString(数组)的功能!
public class GeneticDemo {
public static void main(String[] args) {
String[] names = {"lushimeng", "yangyinyu", "wangliang", "xigua", "xiangjia"};
printArray(names); // 把printArray方法中出现泛型的地方全部变化为String类型
Character[] character = {'2', 'd', 'd', 'r'};
printArray(character); // 把printArray方法中出现泛型的地方全部变化为Character类型
Integer[] ages = {23, 435, 56, 67, 67};
printArray(ages); // 把printArray方法中出现泛型的地方全部变化为Integer类型
}
public static <T> void printArray(T[] array){
if(array != null){
StringBuilder sb = new StringBuilder("[");
for(int i = 0; i < array.length; i++){
sb.append(array[i]).append(i != array.length - 1 ? ", ": ""); // StringBuilder的链式编程
}
sb.append("]");
System.out.println(sb);
}else{
System.out.println(array);
}
}
}
问题1、泛型方法的核心思想:
把出现泛型变量的地方 全部替换 成传输的真实数据类型
问题2、泛型方法的作用
方法中可以使用泛型接收一 切实际类型的参数,方法更具备通用性
自定义泛型接口
泛型接口的概述
使用了泛型定义的接口就是泛型接口。
泛型接口的格式:修饰符 interface 接口名称<泛型变量>{
}
范例: public interface Data<E>{}
课程案例导学
教务系统,提供一个接口可约束一定要完成数据(学生,老师)的增删改查操作
问题1、泛型接口的作用
泛型接口可以约束实现类,实现类可以在实现接口的时候传入自己操作的数据类型这样重写的方法都将是针对于该类型的操作。
泛型通配符、上下限
通配符:?
? 可以在“使用泛型”的时候代表 一切类型。
E T K V 是在定义 泛型 的时候使用的。
泛型通配符:案例导学
开发一个极品飞车的游戏,所有的汽车都能一起参与比赛。
特别注意:虽然BMW和BENZ都继承了Car但是ArrayList<BMW>和ArrayList<BENZ>与ArrayList<Car>没有关系的!!
import java.util.ArrayList;
public class GenericDemo {
public static void main(String[] args) {
ArrayList<BENZ> benzs = new ArrayList<>();
benzs.add(new BENZ());
benzs.add(new BENZ());
benzs.add(new BENZ());
go(benzs); // ? extends Car 为Car的子类都可以传入进去
ArrayList<BMW> bmws = new ArrayList<>();
bmws.add(new BMW());
bmws.add(new BMW());
bmws.add(new BMW());
go(bmws);
ArrayList<Dog> dogs = new ArrayList<>();
dogs.add(new Dog());
// go(dogs); // 不满足泛型上下限的条件
}
public static void go(ArrayList<? extends Car> car){ // 上下限
}
}
class Dog{
}
// 父类
class Car{
}
class BENZ extends Car{
}
class BMW extends Car{
}
泛型的上下限:
? 可以在“使用泛型”的时候代表 一切类型。
? extends Car: ?必须是Car或者其子类 泛型上限
? super Car : ?必须是Car或者其父类 泛型下限
来源:https://blog.csdn.net/qq_43751200/article/details/123803924
0
投稿
猜你喜欢
- 串口通信(Serial Communications)是指外设和计算机间通过数据信号线、地线等按位(bit)进行传输数据的一种通信方式,属于
- 本文实例为大家分享了java实现图书馆管理系统的具体代码,供大家参考,具体内容如下思路:所有包都在book_manage包里利用面向对象的多
- 讲完了inbound事件和outbound事件的传输流程, 这一小节剖析异常事件的传输流程传播异常事件简单的异常处理的场景@Override
- 前言在Activity间传递的数据一般比较简单,但是有时候实际开发中也会传一些比较复杂的数据,本节一起来学习更多Activity间数据的传递
- Vector实现了AbstractList抽象类和List接口,和ArrayList一样是基于Array存储的Vector 是线程安全的,在
- 本文实例为大家分享了java数字转汉字工具类的具体代码,供大家参考,具体内容如下/** * Created by 33303 on 2017
- Intersect子句一、简介Intersect返回交集,交集是指同时出现在两个集合中的元素,和数据库中的Intersect方法实现功能一样
- 本文实例为大家分享了android短信管理器SmsManager的具体代码,供大家参考,具体内容如下需要注册的权限<uses-perm
- 1.什么是mybatis逆向工程在使用mybatis时需要程序员自己编写sql语句,针对单表的sql语句量是很大的,mybatis官方提供了
- 今天练习C#的一个功能,就是将一个字符串时行翻转显示如:string str = "Insus.NET";翻转成为:st
- 好问题。答案就是这篇文章的题目所建议的,这是一种合理的设计。在这种情况下,newInstance()方法是一种“静态工厂方法",让
- ActionBar的引入方式:有几种,从 Android 3.0(API lever 11) 开始,所有使用 Theme.Holo 主题(或
- 最近项目需求中有需要导出Execl表格的要求,而且还是大量的数据,于是把之前的整理了一下,抽成了一个统一的工具类,需要时直接调用工具类即可,
- 如果我们有这样一个应用场景:WidgetA执行点击之后将数据通过widgetB传递到其下的widgetC。通常可以通过设置构造函数,传递对应
- 近来复习数据结构,自己动手实现了栈。栈是一种限制插入和删除只能在一个位置上的表。最基本的操作是进栈和出栈,因此,又被叫作“先进后出”表。首先
- 委托给了C#操作函数的灵活性,我们可使用委托像操作变量一样来操作函数,其实这个功能并不是C#的首创,早在C++时代就有函数指针这一说法,而在
- 概述对于Web开发者,MVC模型是大家再熟悉不过的了,SpringMVC中,满足条件的请求进入到负责请求分发的DispatcherServl
- JPA设置表名和实体名,表字段与实体字段的对应首先 你的jpaProperties配置项中要有<prop key="hibe
- 一.什么是SemaphoreSemaphore,俗称信号量,它是操作系统中PV操作的原语在java的实现,它也是基于AbstractQueu
- 本文实例为大家分享了java利用udp实现发送数据的具体代码,供大家参考,具体内容如下1.udp的特点数据以包的形式发送数据udp是面向无连