java泛型-基础理解(代码片段)

山水相逢-z 山水相逢-z     2022-12-08     230

关键词:

在开发过程中经常会看到泛型或者使用到泛型,所以基于自己的理解,拆分几篇文章由浅入深记录一下。

为什么需要泛型?
泛型这个概念,是在JDK1.5引进来的,其实可以把它理解成一个语法糖,它解决的是什么问题呢?

举个栗子:
假如有以下一个场景,我们需要一个容器类,支持存取不同类型的对象,最基本的实现可能是创建这样一个类:

public class Container
	public Container()
	
	private Object value;
	public void setValue(Object value)
		this.value=value;
	
	public Object getValue()
		return value;
	

我们都知道Object可以指代任何对象,所以这里把容器类的成员变量声明成Object类型,完全可以满足我们存取任何类型对象的需求。来看看如何使用。

存:

Container container1=new Container();
container.setValue(123);
Container container2=new Container();
container2.setValue("test");
Container container3=new Container();
container3.setValue(true);

取:

int a=(int)container.getValue();//123
String b=(String)container.getValue();//"test"
bool c=(boolean)container.getValue();//true

目前为止好像一切都能正常运行,但是你可能也发现有问题了:
每次调用getValue取到返回值后,都需要我们强制类型转换,这就埋下隐患了,因为getValue返回的是Object类型的对象,所以理论上我们可以强转为任何类型,例如:

String a=(String)container1.getValue();//123

上面其实我取出来的是整数 123,但是我们依然可以强转成int类型,这在编译阶段不会有问题,但是当在运行阶段时,就会报出类型转换错误的异常了。

使用泛型实现
上面的问题其实很明显,就是因为我们存和取的时候,其实都不知道具体的类型,这时候泛型就有用了,来改进一下:

public class Container<T>
	private T value;
	public Container()
	
	public void setValue(T value)
		this.value=value;
	
	public T getValue()
		return value;
	

可以看到,这里我们在声明类的时候,在类名后加了<T>这样一个标示,这样我们就指定了Container是一个泛型类,同时可以看到成员变量value也被我们声明成了T类型。
其实泛型就是参数化类型,什么意思呢,就是当我们不确定要使用哪种类型的时候,可以通过泛型,将类型以参数的形式进行限定,来看这时候的存取代码:

Container<Integer> container1 = new Container<>();
Container<String> containe2 = new Container<>();
Container<Boolean> containe3 = new Container<>();

container1.setValue(123);
container2.setValue("test");
container3.setValue(true);

int value1 = container1.getValue();//123
String value2 = container1.getValue();//"test"
boolean value3 = container1.getValue();//true

跟最开始的实现一对比,是不是发现更清晰明了了,也不需要我们对返回的数据手动做强制转换。并且往容器类存数据的时候,如果检查到存入的数据类型跟生成容器对象时传入的范型参数类型不一致的话,在编译阶段就会报错,不会将问题隐藏在运行阶段才暴露出来:

container1.setValue(“test”);//error,不能往Integer容器存String类型的数据

这里有一个需要注意的地方,泛型参数不能传入基本类型,比如int,boolean我们需要使用它们的包装类:Integer,Boolean。

以上我们可以看出,泛型有以下优点:

  • 编译时的强类型检查
  • 避免了类型转换
  • 泛型编程可以实现通用算法

总结起来就是:通用和约束。
以上就是泛型的一个基础理解,后续会继续记录泛型分类(泛型类/泛型接口/泛型方法)、泛型擦除等比较深入的内容。

java零基础小白入门上手教程day15-泛型&file(代码片段)

day15_JAVAOOP课程目标1.【理解】什么是泛型2.【掌握】泛型的基本使用3.【理解】什么是Collections工具类4.【理解】什么是File类5.【掌握】File类的常用功能6.【掌握】打印多级目录案例7.【掌握】文件搜索案例泛型泛型概述​在前面... 查看详情

java零基础小白入门上手教程day15-泛型&file(代码片段)

day15_JAVAOOP课程目标1.【理解】什么是泛型2.【掌握】泛型的基本使用3.【理解】什么是Collections工具类4.【理解】什么是File类5.【掌握】File类的常用功能6.【掌握】打印多级目录案例7.【掌握】文件搜索案例泛型泛型概述​在前面... 查看详情

java基础11:java泛型详解(代码片段)

Java基础11:Java泛型详解 泛型概述泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用。什么是泛型?为什么要使用泛型?泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形... 查看详情

java基础总结三(泛型异常)(代码片段)

文章目录Java基础总结三(泛型、异常)泛型泛型的创建泛型类泛型接口泛型方法类型擦除泛型的协变与逆变异常异常体系异常处理Java基础总结三(泛型、异常)泛型泛型的创建泛型类我们最常用泛型的地方就是... 查看详情

十分钟深刻理解java高级——泛型(代码片段)

文章目录【1】什么是泛型?【2】为什么需要泛型?【3】如何使用泛型?一、泛型类和泛型接口二、一个类如何实现使用泛型接口的类?三、泛型方法的使用①什么是泛型方法?②普通方法:③泛型方法&#x... 查看详情

深入java泛型(四rxjava中深入理解泛型)(代码片段)

第一章深入Java泛型四、RxJava中深入理解泛型4.1响应式编程4.2观察者模式4.3RxJava是对观察者模式的一种高级运用,或者说是一种升级,它把观察者模式具体化,更加明确了各个对象之间的关系四、RxJava中深入理解泛型4.... 查看详情

java中泛型的深入理解(代码片段)

文章目录泛型深入泛型基本介绍自定义泛型类自定义泛型方法自定义泛型接口泛型通配符和上下限泛型深入泛型基本介绍泛型的概述:泛型:是JDK5中引入的特性,可以在编译阶段约束操作的数据类型,并进行检查。泛... 查看详情

java中的泛型理解(代码片段)

泛型,又名"参数化类型",顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。泛型的本质是为... 查看详情

java基础-泛型(代码片段)

一、泛型定义    泛型即“参数化类型”,就是将类型由原来具体的类型参数化,类似于方法中的变量参数,然后使用的时候传入具体的参数。这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛... 查看详情

java-基础(集合泛型)(代码片段)

JAVA-基础(集合泛型)1.什么是泛型?可以在类或方法中预支地使用未知的类型。2.泛型的好处?将运行时期的ClassCastException,转移到了编译时期变成了编译失败。避免了类型强转的麻烦。(集合中是可以存放任意对象的,只要把... 查看详情

java基础之泛型(代码片段)

泛型genericity格式:<自定义泛型无意义大写英文字母占位符>例:<T>Type<E>Element<K>Key<V>value泛型可以在方法,类,接口中使用泛型在方法中使用使用静态方法的泛型格式:publicstatic<T>返回值类型[自定义... 查看详情

java基础语法详解java中的泛型(代码片段)

前言:泛型的知识其实在前面Java的泛型和包装类这章介绍过了一些,但那些知识是为后面介绍Java集合框架做的铺垫,而今天这章再配合之前那章,将会完整的介绍Java中的泛型!文章目录1.前章回顾1.1泛型类的... 查看详情

java基础核心面试问题分析(持续更新)(代码片段)

...f;如何理解Java中的字节码对象?你是如何理解Java中的泛型的?说说泛型应用在什么场景呢?如何理解Java中的泛型通配符?说说什么是泛型类型擦除?Java虚拟机分析你是如何理解JVM的?我们为什么要学习JVM... 查看详情

java基础语法java的泛型和包装类(代码片段)

...章主要是为了后面学习集合框架所做的知识补充。补充了泛型以及包装类两个知识,但是该章泛型的讲解不够全面,主要是为了集合框架学习做铺垫。文章目录1.预备知识-泛型(Generic)1.1泛型的引入1.2泛型的分类... 查看详情

尚硅谷_java零基础教程(泛型generics)--学习笔记(代码片段)

Java泛型一、为什么要有泛型1、为什么要有泛型(Generic)2、泛型的概念二、在集合中使用泛型三、自定义泛型结构1、自定义泛型结构1.1、泛型类、泛型接口1.2、泛型方法2、自定义泛型demo四、泛型在继承上的体现五、通配符的使用... 查看详情

java基础知识之泛型简单介绍(代码片段)

1、什么是java泛型?java泛型:英文名称是generics,泛型是jdk5引入的一个新特性,java泛型的本质就是参数化类型,就是所有的操作数据类型被指定为一个参数。对参数化类型进行操作的实体(例如类、接口... 查看详情

java基础知识之泛型简单介绍(代码片段)

1、什么是java泛型?java泛型:英文名称是generics,泛型是jdk5引入的一个新特性,java泛型的本质就是参数化类型,就是所有的操作数据类型被指定为一个参数。对参数化类型进行操作的实体(例如类、接口... 查看详情

java基础总结三(泛型异常)(代码片段)

文章目录Java基础总结三(泛型、异常)泛型泛型的创建泛型类泛型接口泛型方法类型擦除泛型的协变与逆变异常异常体系异常处理Java基础总结三(泛型、异常)泛型泛型的创建泛型类我们最常用泛型的地方就是... 查看详情