数据结构 - 泛型

目录

前言

1. 什么是泛型?

2. 为什么需要泛型?

引入泛型之前

引入泛型之后

3.泛型类

4.泛型的界限

1.上下界

2.通配符


前言

今天给大家介绍一下泛型的使用

数据结构 - 泛型_第1张图片


1. 什么是泛型?

一般的类和方法,只能使用具体的类型: 要么是基本类型,要么是自定义的类。如果要编写可以应用于多种类型的 代码,这种刻板的限制对代码的束缚就会很大。

                                                                                      ----- 来源《Java编程思想》对泛型的介绍。

泛型是在JDK1.5引入的新的语法,通俗讲,泛型:就是适用于许多许多类型。从代码上讲,就是对类型实现了参数化。

2. 为什么需要泛型?

引入泛型之前

我们不妨先来看一个例子

数据结构 - 泛型_第2张图片

目前来看一切正常,你可能还会说: 这不是挺好的吗?

我只能说: 别急

数据结构 - 泛型_第3张图片

多态的弊端是无法访问子类的特有功能

现在你感觉如何?

虽然在这种情况下,当前集合任何数据都可以存放,但是,更多情况下,我们还是希望他只能够持有一种数据类型。而不是同时持有这么多类型。所以,泛型的主要目的:就是指定当前的容器,要持有什么类型的对象。让编译器去做检查。此时,就需要把类型,作为参数传递。需要什么类型,就传入什么类型。

引入泛型之后

数据结构 - 泛型_第4张图片

可以看到,编译直接报错.需要被提供的类型和真实提供的类型不匹配!
泛型是在jdk5引入的,在jdk7时为了简化开发,java7增加了一个语言特性,称为菱形运算符<>

ArrayList list = new ArrayList<>();

3.泛型类

应用场景: 当一个类中,某个变量的类型不确定时,就可以定义带有泛型的类

上面的例子中的ArrayList就是通过泛型来实现的

数据结构 - 泛型_第5张图片

此处的E可以理解为变量,用来记录数据的类型(字母可以随意定义,常用为E,T,V,K,

E 表示 Element K 表示 Key V 表示 Value N 表示 Number T 表示 Type)

数据结构 - 泛型_第6张图片

除了泛型类之外,还有泛型方法和泛型接口,和泛型类没什么本质区别,大家自行了解即可。

4.泛型的界限

在定义泛型类时,有时需要对传入的类型变量做一定的约束,可以通过类型边界来约束。

1.上下界

在Java的泛型中,可以使用上界(Upper Bounds)和下界(Lower Bounds)来限制泛型类型的范围。

上界使用extends关键字来定义,表示泛型类型必须是指定类或其子类。例如,T extends Number表示T必须是Number类或其子类。在使用上界时,可以使用多个上界,使用逗号分隔。例如,T extends Number & Comparable表示T必须是Number类及其子类,并且实现了Comparable接口。

下界使用super关键字来定义,表示泛型类型必须是指定类或其父类。例如,T super Integer表示T必须是Integer类或其父类。

使用上界和下界可以提供更加灵活的泛型类型限制,使得泛型类型可以满足特定的要求。例如,使用上界可以确保泛型类型具有某些特定的方法或属性,而使用下界可以确保泛型类型可以接受某些类型的参数。

2.通配符

通配符(Wildcard)是Java泛型中的一种特殊符号,用于表示未知类型。

通配符有两种形式:?? extends T

?表示任意类型,可以用来表示不确定的类型。

? extends T表示类型的上界,表示泛型类型必须是T类型或其子类。

通配符可以用于方法的参数类型、返回类型、变量类型等位置,通过使用通配符,可以使泛型更加灵活和通用。

数据结构 - 泛型_第7张图片

你可能感兴趣的:(数据结构与算法,数据结构)