• 简单认识泛型【java】


    目录

    1.什么是泛型

     2.引出泛型

    2.1语法 

    3. 泛型类的使用

    3.1 语法

    4 泛型如何编译的

    4.1 擦除机制

    5.泛型的上下界

    5.1 语法

     6.注意


    1.什么是泛型

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

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

     2.引出泛型

             泛型的主要目的:就是指定当前的容器,要持有什么类型的对象。让编译器去做检查。此时,就需要把类型,作为参数传递。需要什么类型,就传入什么类型。

    2.1语法 

    1. class 泛型类名称<类型形参列表> {
    2. // 这里可以使用类型参数
    3. }
    4. class ClassName, T2, ..., Tn> {
    5. }
    6. class 泛型类名称<类型形参列表> extends 继承类/* 这里可以使用类型参数 */ {
    7. // 这里可以使用类型参数
    8. }
    9. class ClassName, T2, ..., Tn> extends ParentClass {
    10. // 可以只使用部分类型参数
    11. }
    注意:
    1.类名后的 代表占位符,表示当前类是一个泛型类
    了解: 【规范】类型形参一般使用一个大写字母表示,常用的名称有:
            E 表示 Element
            K 表示 Key
            V 表示 Value
            N 表示 Number
            T 表示 Type
            S, U, V 等等 - 第二、第三、第四个类型
    2.不需要进行类型转换

    3. 泛型类的使用

    3.1 语法

    1. 泛型类<类型实参> 变量名; // 定义一个泛型类引用
    2. new 泛型类<类型实参>(构造方法实参); // 实例化一个泛型类对象
    3. MyArray<Integer> list = new MyArray<Integer>();

             当编译器可以根据上下文推导出类型实参时,可以省略类型实参的填写。

    例如:

    MyArray<Integer> list = new MyArray<>(); // 可以推导出实例化需要的类型实参为 Integer
    1.   泛型是将数据类型参数化,进行传递
    2.  使用 表示当前类是一个泛型类。
    3.  泛型目前为止的优点:数据类型参数化,编译时自动进行类型检查和转换

    泛型如何编译的

    4.1 擦除机制

            让我么来了解一下泛型到底是怎么编译的?
            通过命令:javap -c 查看字节码文件,所有的 T 都是 Object

            在编译的过程当中,将所有的T替换为Object这种机制,我们称为:擦除机制

            Java的泛型机制是在编译级别实现的。编译器生成的字节码在运行期间并不包含泛型的类型信息。         

    5.泛型的上下界

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

    5.1 语法

    1. class 泛型类名称<类型形参 extends 类型边界> {
    2. ...
    3. }
    4. public class MyArray extends Number> {
    5. ...
    6. }
    7. MyArray<Integer> l1; // 正常,因为 Integer 是 Number 的子类型
    8. MyArray<String> l2; // 编译错误,因为 String 不是 Number 的子类型

    下界通配符

    1. // 下界通配符 <? super T>
    2. class 泛型类名称<类型形参 extends 类型边界> {
    3. ...
    4. }
    5. public class MyArray<E super Number> {
    6. ...
    7. }
    8. MyArray(Float) l1;// 编译正确
    9. // ObjectNumber 的父类
    10. MyArray(Object) l2;// 编译错误

     6.注意

           注意 不能new泛型类型的数组     
    public T [] array = ( T []) new Object [ 10 ]; // 是不对的
            通俗讲就是:返回的数组里面,可能存放的是任何的数据类型,可能是 String ,可能是 Person ,运行的时 候,直接转给Integer 类型的数组,编译器认为是不安全的.
    public T [] array ;//正确; 

            泛型提供了一些好处,如改进的类型安全性、代码重用和更干净的代码。它们允许你编写更通用的算法和数据结构,可以处理不同的类型,而不会牺牲编译时的类型检查。通过使用泛型,你可以创建更加健壮和可维护的Java代码。 

    结语:泛型的相关分享到这里就结束了,希望对大家的学习会有帮助,如果大家有什么问题或者不同的见解,欢迎大家评论区的留言, 感谢支持

  • 相关阅读:
    webGIS外包开发框架及特点
    2019年12月 Scratch(二级)真题解析#中国电子学会#全国青少年软件编程等级考试
    基于 Angular和Material autocomplete组件再封装的可双向绑定key-value的可输入下拉框
    网络安全(黑客)自学笔记
    linux中的lsof命令简介
    八股文-TCP的四次挥手
    C# 日期格式化工具类型扩展
    37.云原生之springcloud+k8s+GitOps+istio+安全实践
    全链路资金订单仓位诊断模型设计
    SpringBoot文件上传
  • 原文地址:https://blog.csdn.net/qq_61576108/article/details/134460558