目录
1.什么是泛型
2.引出泛型
2.1语法
3. 泛型类的使用
3.1 语法
4 泛型如何编译的
4.1 擦除机制
5.泛型的上下界
5.1 语法
6.注意
1.什么是泛型
一般的类和方法,只能使用具体的类型: 要么是基本类型,要么是自定义的类。如果要编写可以应用于多种类型的 代码,这种刻板的限制对代码的束缚就会很大。------- 来源《Java编程思想》对泛型的介绍。
泛型是在JDK1.5引入的新的语法,通俗讲,泛型:就是适用于许多许多类型。从代码上讲,就是对类型实现了参数化。
2.引出泛型
泛型的主要目的:就是指定当前的容器,要持有什么类型的对象。让编译器去做检查。此时,就需要把类型,作为参数传递。需要什么类型,就传入什么类型。
2.1语法
class 泛型类名称<类型形参列表> {
// 这里可以使用类型参数
}
class ClassName<T1, T2, ..., Tn> {
}
class 泛型类名称<类型形参列表> extends 继承类/* 这里可以使用类型参数 */ {
// 这里可以使用类型参数
}
class ClassName<T1, T2, ..., Tn> extends ParentClass<T1> {
// 可以只使用部分类型参数
}
注意:1.类名后的 <T> 代表占位符,表示当前类是一个泛型类了解: 【规范】类型形参一般使用一个大写字母表示,常用的名称有:E 表示 ElementK 表示 KeyV 表示 ValueN 表示 NumberT 表示 TypeS, U, V 等等 - 第二、第三、第四个类型2.不需要进行类型转换
3. 泛型类的使用
3.1 语法
泛型类<类型实参> 变量名; // 定义一个泛型类引用
new 泛型类<类型实参>(构造方法实参); // 实例化一个泛型类对象
MyArray<Integer> list = new MyArray<Integer>();
当编译器可以根据上下文推导出类型实参时,可以省略类型实参的填写。
例如:
MyArray<Integer> list = new MyArray<>(); // 可以推导出实例化需要的类型实参为 Integer
- 泛型是将数据类型参数化,进行传递
- 使用 <T> 表示当前类是一个泛型类。
- 泛型目前为止的优点:数据类型参数化,编译时自动进行类型检查和转换
4 泛型如何编译的
4.1 擦除机制
在编译的过程当中,将所有的T替换为Object这种机制,我们称为:擦除机制。
Java的泛型机制是在编译级别实现的。编译器生成的字节码在运行期间并不包含泛型的类型信息。
5.泛型的上下界
5.1 语法
class 泛型类名称<类型形参 extends 类型边界> {
...
}
public class MyArray<E extends Number> {
...
}
MyArray<Integer> l1; // 正常,因为 Integer 是 Number 的子类型
MyArray<String> l2; // 编译错误,因为 String 不是 Number 的子类型
下界通配符 <? super T>
// 下界通配符 <? super T>
class 泛型类名称<类型形参 extends 类型边界> {
...
}
public class MyArray<E super Number> {
...
}
MyArray(Float) l1;// 编译正确
// Object 是 Number 的父类
MyArray(Object) l2;// 编译错误
6.注意
public T [] array = ( T []) new Object [ 10 ]; // 是不对的
public T [] array ;//正确;
泛型提供了一些好处,如改进的类型安全性、代码重用和更干净的代码。它们允许你编写更通用的算法和数据结构,可以处理不同的类型,而不会牺牲编译时的类型检查。通过使用泛型,你可以创建更加健壮和可维护的Java代码。
结语:泛型的相关分享到这里就结束了,希望对大家的学习会有帮助,如果大家有什么问题或者不同的见解,欢迎大家评论区的留言, 感谢支持