深入java泛型一泛型的作用与定义(代码片段)

持续学习刻意练习 持续学习刻意练习     2022-12-09     677

关键词:

第一章深入 Java 泛型

一、泛型的作用与定义

1.1 泛型的作用

  • 使用泛型能写出更加灵活通用的代码。

泛型的设计主要参照了 C++ 的模板,旨在能让你写出更加通用化,更加灵活的代码。模板/泛型代码,就好像做雕塑时的模板,有了模板,需要生产的时候就只管向里面注入具体的材料就行,不同的材料可以产生不同的效果,这便是泛型最初的设计宗旨。

  • 泛型将代码安全性检查提前到编译期。

泛型被加入 Java 语法中,还有一个最大的原因:解决容器的类型安全,使用泛型后,能让编译器在编译的时候借助传入的类型参数检查对容器的插入,获取操作是否合法,从而将运行时 ClassCastException 转移到编译时。比如:

List dogs = new ArrayList();
dogs.add(new Cat());

在没有泛型之前,这种代码除非运行,否则你永远找不到它的错误。但是加入泛型后,

List<Dog> dogs = new ArrayList<>();
dogs.add(new Cat()); // Error Compile

会在编译的时候就检查出来。

  • 泛型能够省去类型强制转换。

在 JDK1.5 之前,Java 容器都是通过将类型向上转型为 Object 类型来实现的,因此在从容器中取出来的时候需要手动的强制转换。

Dog dog = (Dog)dogs.get(1);

加入泛型后,由于编译器知道了具体的类型,因此编译器会自动进行强制转换,使得代码更加优雅。

早期 Java 是使用 Object 来代表任意类型的,但是向下转型有强转的问题,这样程序就不太安全。

有了泛型以后:

  • 代码更加简洁【不用强制转换】
  • 程序更加健壮【只要编译时期没有警告,那么运行时期就不会出现 ClassCastException 异常】
  • 可读性和稳定性【在编写集合的时候,就限定了类型】
  • 使用增强 for 遍历集合

1.2 泛型的定义

自 JDK 1.5 之后,Java 通过泛型解决了容器类型安全这一问题,而几乎所有人接触泛型也是通过 Java 的容器。那么泛型究竟是什么?

泛型的本质是参数化类型。

也就是说,泛型就是将所操作的数据类型作为参数的一种语法。

public class Play<T> 
    T play()

其中 T 就是作为一个类型参数在 Play 被实例化的时候所传递来的参数,比如:

Play<Integer> playInteger = new Play<>();

这里 T 就会被实例化为 Integer。

Java 泛型设计原则:只要在编译时期没有出现警告,那么运行时期就不会出现 ClassCastException 异常。

泛型:把类型明确的工作推迟到创建对象或调用方法的时候才去明确的特殊的类型。

参数化类型:

  • 把类型当作是参数一样传递
  • <数据类型>只能是引用类型

相关术语:

  • ArrayList 中的 E 称为类型参数变量
  • ArrayList 中的 Integer 称为实际类型参数
  • 整个 ArrayList 称为泛型类型
  • 整个 ArrayList 称为参数化的类型

1.3 泛型擦除

泛型是提供给 java 编译器使用的,它用于限定集合的输入类型,让编译器在源代码级别上,即挡住向集合中插入非法数据。但编译器编译完带有泛型的 java 程序后,生成的 class 文件中将不再带有泛型信息,以此使程序运行效率不受到影响,这个过程称之为“擦除”。

泛型是类型擦除的,参考:点击这里

深入java泛型(三泛型的上下边界)(代码片段)

第一章深入Java泛型三、泛型的上下边界3.1<?extendsE>:上界通配符(UpperBoundsWildcards)3.2<?superE>:下界通配符(LowerBoundsWildcards)3.3上下通配符的副作用三、泛型的上下边界?extendE是泛型的上边界࿰... 查看详情

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

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

深入java泛型(三泛型的上下边界)(代码片段)

第一章深入Java泛型三、泛型的上下边界3.1<?extendsE>:上界通配符(UpperBoundsWildcards)3.2<?superE>:下界通配符(LowerBoundsWildcards)3.3上下通配符的副作用三、泛型的上下边界?extendE是泛型的上边界࿰... 查看详情

java重点--泛型(代码片段)

文章目录💖泛型的概念✨使用泛型的好处与弊端✨定义和使用含有泛型的类✨定义和使用含有泛型的方法✨定义和使用含有泛型的接口✨泛型的通配符✨通配符的高级使用--受限泛型✨斗地主小案例💖泛型的概念泛型是... 查看详情

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

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

java泛型——你所不知道的那些泛型背后

一泛型1编译期确定类型安全泛型Generics2参数化类型与原始类型的兼容性3类型擦除4泛型的定义与使用Java泛型(一)——泛型的定义与使用Java泛型(二)——使用Gson解析嵌套泛型数组一、泛型1、编译期确定类型安全——泛... 查看详情

java?不定类型与泛型的使用解决list继承参数(代码片段)

?表示不确定的数据类型。下面我们来看看怎么使用。定义模型和子模型@DatapublicclassModelStringid;Stringname;Stringdesc;@DatapublicclassSubModelextendsModelStringsubName;定义List泛型接口和实现publicinterfaceMultiModelService/***多模 查看详情

java5泛型深入研究

Java5泛型深入研究 上接《Java泛型的理解与等价实现》,这个仅仅是泛型的入门。有博友反映泛型很复杂,难以掌握。鉴于此,写一片续集。 实际上泛型可以用得很复杂,复杂到编写代码的人员自己也难以看懂。这往往是... 查看详情

java遗珠之泛型的作用(代码片段)

泛型总共有三个作用编译时进行更强大的类型检查编译时错误比运行时错误更好发现和处理消除类型转换Listlist=newArrayList();list.add("hello");Strings=(String)list.get(0);使用泛型之后去掉转换List<String>list=newArrayList<Str... 查看详情

大数据必学java基础(五十五):泛型深入了解(代码片段)

文章目录泛型深入了解一、引入1、什么是泛型(Generic)2、没有泛型的时候使用集合3、JDK1.5以后开始使用泛型,集合中使用泛型4、泛型总结二、自定义泛型结构1、泛型类,泛型接口2、泛型方法3、泛型参数存在... 查看详情

java泛型和内部类(代码片段)

文章目录一、泛型的概述1.概念2.泛型的定义3.泛型的使用4.泛型的意义5.泛型是如何编译的?二、泛型的进一步使用1.泛型类的定义-类型边界Number类2.泛型方法3.泛型中的父子类型4.通配符?通配符上界通配符下界5.泛型的... 查看详情

初识java集合及包装类和泛型的基本使用(代码片段)

....Collection接口说明2.Collection示例3.Map接口说明4.Map实例三、泛型1.泛型的分类2.泛型的定义3.泛型背后作用时期和背后的简单原理4.泛型的使用5.泛型总结四、包装类1.基本数据类型和包装类直接的对应关系2.包装类的使用,装箱(b 查看详情

java泛型简介定义和使用含有泛型的类定义和使用含有泛型的方法定义和使用含有泛型的接口泛型通配符?受限泛型(代码片段)

泛型简介:集合中存储数据的类型称之为泛型,泛型是一种未知的数据类型,当不知道使用什么数据类型的时候可以使用泛型;当创建对象时在指明数据类型并赋值给泛型即可;泛型也可以看做是一个变量ÿ... 查看详情

java泛型的基本介绍和使用

现在开始深入学习java的泛型了,以前一直只是在集合中简单的使用泛型,根本就不明白泛型的原理和作用。泛型在java中,是一个十分重要的特性,所以要好好的研究下。一、泛型的基本概念 泛型的定义:泛型是JDK1.5的一项... 查看详情

java泛型简述(代码片段)

泛型的特点:声明泛型时的位置特殊,用<>来声明使用方法与其他变量类型没有太大差异主要作用是可以让不同的变量类型进行统一操作,包括引用数据类型和对象与Object相比的好处有:不需要强制类型转换&#... 查看详情

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

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

java泛型的作用及其基本概念

一、泛型的基本概念   java与c#一样,都存在泛型的概念,及类型的参数化。java中的泛型是在jdk5.0后出现的,但是java中的泛型与C#中的泛型是有本质区别的,首先从集合类型上来说,java中的ArrayList<Integer>和ArrayList&... 查看详情

java_泛型笔记(代码片段)

文章目录Java_泛型简介Java_泛型的概念Java_为什么存在泛型Java_自定义泛型结构Java_泛型的声明Java_泛型的实例化Java_泛型类Java_泛型方法Java_泛型在继承上的体现Java_通配符的使用Java_泛型简介集合容器类在设计阶段/声明阶段不能确... 查看详情