Java泛型是JDK1.5中引入的一个新特性,其本质是参数化类型,也就是说所操作的数据类型被指定为一个参数(type parameter)这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法
通俗讲,泛型:就是适用于许多许多类型。从代码上讲,就是对类型实现了参数化。
🔎泛型的标志
class ExArray<T> {
}
红框代表占位符,表示当前类是一个泛型类
其中<>中的字母可以是任意的
<>中的字母个数可以是多个
🔎实例化泛型类
🌻<>中单个字母实例化
class ExArray<T> {
}
public class Test {
public static void main(String[] args) {
//ExArray exArray = new ExArray();
//ExArray<Integer> exArray = new ExArray<Integer>();
//后面<>中类型可以省略,如果写,必须与前面一致
ExArray<Integer> exArray = new ExArray<>();
}
}
<>中单个字母,定义成员变量的方式
🌻<>中多个字母实例化
class ExArray<T,P,X> {
}
public class Test {
public static void main(String[] args) {
ExArray<Integer,String,Character> exArray = new ExArray<>();
}
}
<>中多个字母,定义成员变量的方式
红框位置虽然编译正确,但是只使用了一种类型,这样定义对于多种类型是不好的
🌼注意事项
<>中多个字母,不能进行方法的重载
这是因为Java的擦除机制
both methods hava same erasure——两种方法都有擦除
🔎擦除机制
在编译的过程当中,将所有的<>中的字母替换为Object这种机制,我们称为:擦除机制
Java的泛型机制是在编译级别实现的。编译器生成的字节码在运行期间并不包含泛型的类型信息
也就是说,泛型只存在于编译时期,当程序运行时,泛型就被擦除为Object
🔎泛型的上界
在定义泛型类时,有时需要对传入的类型变量做一定的约束,可以通过类型边界来约束
🌻举例
class ExArray<T extends Number> {
}
表示只接受Number及Number的子类作为T的实参
如果未指定类型边界,可以理解为T extends Object
🔎泛型方法
class ExArray {
public<T extends Number> T func(T data) {
return data;
}
}
限定符 <类型形参列表> 返回值类型 方法名 形参