目录
前言
今天给大家介绍一下泛型的使用
1. 什么是泛型?
一般的类和方法,只能使用具体的类型: 要么是基本类型,要么是自定义的类。如果要编写可以应用于多种类型的 代码,这种刻板的限制对代码的束缚就会很大。
----- 来源《Java编程思想》对泛型的介绍。
泛型是在JDK1.5引入的新的语法,通俗讲,泛型:就是适用于许多许多类型。从代码上讲,就是对类型实现了参数化。
2. 为什么需要泛型?
引入泛型之前
我们不妨先来看一个例子
目前来看一切正常,你可能还会说: 这不是挺好的吗?
我只能说: 别急
多态的弊端是无法访问子类的特有功能
现在你感觉如何?
虽然在这种情况下,当前集合任何数据都可以存放,但是,更多情况下,我们还是希望他只能够持有一种数据类型。而不是同时持有这么多类型。所以,泛型的主要目的:就是指定当前的容器,要持有什么类型的对象。让编译器去做检查。此时,就需要把类型,作为参数传递。需要什么类型,就传入什么类型。
引入泛型之后
可以看到,编译直接报错.需要被提供的类型和真实提供的类型不匹配!
泛型是在jdk5引入的,在jdk7时为了简化开发,java7增加了一个语言特性,称为菱形运算符<>
ArrayList<String> list = new ArrayList<>();
3.泛型类
应用场景: 当一个类中,某个变量的类型不确定时,就可以定义带有泛型的类
上面的例子中的ArrayList就是通过泛型来实现的
此处的E可以理解为变量,用来记录数据的类型(字母可以随意定义,常用为E,T,V,K,
E 表示 Element K 表示 Key V 表示 Value N 表示 Number T 表示 Type)
除了泛型类之外,还有泛型方法和泛型接口,和泛型类没什么本质区别,大家自行了解即可。
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类型或其子类。
通配符可以用于方法的参数类型、返回类型、变量类型等位置,通过使用通配符,可以使泛型更加灵活和通用。