java泛型泛型简介(泛型类|泛型方法|静态方法的泛型|泛型类与泛型方法完整示例)(代码片段)

韩曙亮 韩曙亮     2022-12-31     373

关键词:





一、泛型简介



泛型 可以 简单理解为 参数化类型 , 主要作用在 类 , 方法 , 接口 上 ;

java 泛型 与 C++ 模板 : Java 中的泛型 , 是仿照 C++ 中的 模板 开发的 , 目的是让开发者可以写出 通用 , 灵活 的代码 ;

伪泛型 : Java 中的泛型 , 是 伪泛型 , Java 泛型开发好之后 , 在 编译阶段将泛型相关的信息消除 了 , 不会泛型留到运行时 ;


泛型类型 :

  • 泛型方法 : 方法有参数 , 方法的参数 可以指定成一些 泛型 ;
  • 泛型类 : 类 也可以有参数 , 将 类型 作为 参数 传入类中 ;
  • 泛型接口 : 接口 的 参数 , 也可以是泛型 ;

类型 传入 泛型方法 , 泛型类 , 泛型接口 中 , 可以 动态地 指定一些类型 ;


泛型的作用 :

  • 安全检查 :编译阶段 , 就可以进行 代码检查 , 将更少的错误带到运行时 ;
  • 避免强转 : 避免 类型的强转 导致不必要的安全问题 ;
  • 提高性能 : 使用泛型可以 提高 Java 的性能 ;




二、泛型类



泛型类 :类名后面 使用 <T> 声明泛型 , 则在该类中 , 可以使用该泛型类型 T 类型 ;

特别注意 , 该类中的 如下 2 2 2 个方法 不是 泛型方法 ; 其中的 参数 , 返回值 类型是 T , 但 这个 T 是作为一个正常的类型使用的 , 并不是声明在 方法 中的泛型 ;

如果 类 , 接口 , 方法 是 泛型类 , 泛型接口 , 泛型方法 , 则该 类 , 接口 , 方法 必须由 <T> 修饰 , 有个带尖括号的 T ;

    public T getData() 
        return data;
    

    public void setData(T data) 
        this.data = data;
    

泛型类完整代码示例 :

/**
 * 泛型类
 *  该 T 类型作为参数使用
 *  T 是参数化类型 , 可以由外部传入
 *
 * @param <T>
 */
public class Student<T> 

    private String name;
    private int age;
    /**
     * 该数据的类型未知
     *  使用泛型表示 , 运行时确定该类型
     */
    private T data;

    public Student(String name, int age, T data) 
        this.name = name;
        this.age = age;
        this.data = data;
    

    /**
     * 该方法不是泛型方法
     *  该方法是普通方法 , 返回值类型是 T 类型
     * @return
     */
    public T getData() 
        return data;
    

    public void setData(T data) 
        this.data = data;
    





三、泛型方法



泛型方法 : 在方法的 返回值前 , 使用 <T> 声明泛型的方法 , 是泛型方法 ; 将某个类型作为参数传入 ;

泛型个数 : 该方法是泛型方法 , 且指定了 2 2 2 个泛型 , 泛型的个数可以有很多个 , 多个泛型之间 , 使用逗号隔开 ;


泛型方法 与 泛型类 中的泛型 :

  • 泛型不同 : 泛型方法指定的泛型 T类中的泛型 T 没有任何关系 , 这两个 T 可以是不同的类型 ;

  • 泛型相同 : 泛型方法中定义的 泛型 T , 与 参数类型的 T , 返回值类型的 T , 方法内部的 T , 都是同一个类型 ;

/**
 * 泛型类
 *  该 T 类型作为参数使用
 *  T 是参数化类型 , 可以由外部传入
 *
 * @param <T>
 */
public class Student<T> 

    private String name;
    private int age;
    /**
     * 该数据的类型未知
     *  使用泛型表示 , 运行时确定该类型
     */
    private T data;

    public Student(String name, int age, T data) 
        this.name = name;
        this.age = age;
        this.data = data;
    

    /**
     * 泛型方法 , 是将某个类型作为参数传入
     *      方法指定泛型 , 写法如下
     *
     * 该方法是泛型方法
     *      方法指定了 2 个泛型
     *      泛型个数 , 泛型的个数可以有很多个
     *      多个泛型之间 , 使用逗号隔开
     *
     * 为方法指定的泛型 T 与类中的泛型 T 没有任何关系
     *      这两个 T 可以是不同的类型
     *
     * 泛型方法中定义的泛型 T
     *      与参数类型的 T
     *      返回值类型的 T
     *      方法内部的 T
     *      都是同一个类型
     *
     * 与泛型类中的 T 完全没有关系
     *
     * @param <T>
     * @param <A>
     * @return
     */
    public <T, A> T getData2(T arg)
        T data = arg;
        return data;
    





四、静态方法的泛型



静态方法泛型 : 如果静态方法中 使用了 类中的泛型 T , 作为参数 或 返回值 , 这种使用时错误的 ;

如果必须在 静态方法 中使用泛型 T , 则该泛型 T 必须是静态方法的泛型 , 不能是类的泛型 ;


错误用法 :

正确用法 :





五、泛型类与泛型方法完整示例



/**
 * 泛型类
 *  该 T 类型作为参数使用
 *  T 是参数化类型 , 可以由外部传入
 *
 * @param <T>
 */
public class Student<T> 

    private String name;
    private int age;
    /**
     * 该数据的类型未知
     *  使用泛型表示 , 运行时确定该类型
     */
    private T data;

    public Student(String name, int age, T data) 
        this.name = name;
        this.age = age;
        this.data = data;
    

    /**
     * 该方法不是泛型方法
     *  该方法是普通方法 , 返回值类型是 T 类型
     * @return
     */
    public T getData() 
        return data;
    

    public void setData(T data) 
        this.data = data;
    

    /**
     * 泛型方法 , 是将某个类型作为参数传入
     *      方法指定泛型 , 写法如下 ;
     *
     * 该方法是泛型方法
     *      方法指定了 2 个泛型
     *      泛型个数 , 泛型的个数可以有很多个
     *      多个泛型之间 , 使用逗号隔开
     *
     * 泛型方法指定的泛型 T 与类中的泛型 T 没有任何关系
     *      这两个 T 可以是不同的类型
     *
     * 泛型方法中定义的泛型 T
     *      与参数类型的 T
     *      返回值类型的 T
     *      方法内部的 T
     *      都是同一个类型
     *
     * 与泛型类中的 T 完全没有关系
     *
     * @param <T>
     * @param <A>
     * @return
     */
    public <T, A> T getData2(T arg)
        T data = arg;
        return data;
    

    /**
     * 如果静态方法中使用类 类中的泛型
     *      这种使用时错误的
     *
     * 如果必须在 静态方法 中使用泛型 T
     *      则该泛型 T 必须是静态方法的泛型
     *      不能是类的泛型
     *
     * @param arg
     * @return
     */
    public static <T> T getData3(T arg)
        T data = arg;
        return data;
    

java——泛型类和泛型方法(静态方法泛型)

泛型类定义的泛型,在整个类中有效。如果被方法是用,那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了。为了让不同的方法可以操作不同类型,而且类型还不确定。那么可以将泛型... 查看详情

泛型类中的静态方法?

】泛型类中的静态方法?【英文标题】:Staticmethodinagenericclass?【发布时间】:2010-10-3011:58:51【问题描述】:在Java中,我想要一些东西:classClazz<T>staticvoiddoIt(Tobject)//...但我明白了无法对非静态类型T进行静态引用除了基本用... 查看详情

java基础总结三(泛型异常)(代码片段)

文章目录Java基础总结三(泛型、异常)泛型泛型的创建泛型类泛型接口泛型方法类型擦除泛型的协变与逆变异常异常体系异常处理Java基础总结三(泛型、异常)泛型泛型的创建泛型类我们最常用泛型的地方就是... 查看详情

java泛型:泛型类泛型接口和泛型方法

根据《Java编程思想(第4版)》中的描述,泛型出现的动机在于:有许多原因促成了泛型的出现,而最引人注意的一个原因,就是为了创建容器类。泛型类容器类应该算得上最具重用性的类库之一。先来看一个没有泛型的情况下... 查看详情

typescript泛型(代码片段)

TypeScript泛型1什么是泛型2泛型方法3泛型类4泛型接口1什么是泛型泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、... 查看详情

java基础总结三(泛型异常)(代码片段)

文章目录Java基础总结三(泛型、异常)泛型泛型的创建泛型类泛型接口泛型方法类型擦除泛型的协变与逆变异常异常体系异常处理Java基础总结三(泛型、异常)泛型泛型的创建泛型类我们最常用泛型的地方就是... 查看详情

java泛型:泛型类泛型接口和泛型方法

原文出自:https://segmentfault.com/a/1190000002646193泛型类publicclassContainer<K,V>{privateKkey;privateVvalue;publicContainer(Kk,Vv){key=k;value=v;}publicKgetKey(){returnkey;}publicvoidsetKey(Kkey){thi 查看详情

java泛型知识点:泛型类泛型接口和泛型方法

有许多原因促成了泛型的出现,而最引人注意的一个原因,就是为了创建容器类。泛型类容器类应该算得上最具重用性的类库之一。先来看一个没有泛型的情况下的容器类如何定义:publicclassContainer{privateStringkey;privateStringvalue;pub... 查看详情

java泛型_泛型类接口通配符方法上下边界(代码片段)

文章目录①.泛型的概述②.泛型-类class③.泛型-接口④.泛型-通配符?⑤.泛型-方法⑥.泛型上下边界①.泛型的概述①.泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类... 查看详情

从非泛型类调用抽象泛型类中定义的方法的最佳方法是啥

】从非泛型类调用抽象泛型类中定义的方法的最佳方法是啥【英文标题】:Whatisthebestwaytocallamethoddefinedinsideanabstractgenericclassfromanongenericclass从非泛型类调用抽象泛型类中定义的方法的最佳方法是什么【发布时间】:2021-09-1418:53:48... 查看详情

java--泛型--泛型接口&泛型方法(代码片段)

泛型接口  packagecom.model.fanxing;/***@Description:测试类*@Author:张紫韩*@Crete2021/6/3022:14*泛型接口和实现类*1.泛型接口的实现类,是一个泛型类,那么要保证实现接口的泛型类的反省表示中要包含泛型接口的泛型标识*2.泛型接口... 查看详情

java的泛型---(英雄联盟集合嵌套案例)(代码片段)

目录Java的泛型JDK1.5以后出现的机制为什么会有泛型呢?泛型泛型类泛型方法泛型接口泛型通配符?extendsE?superE增强for泛型类的测试 泛型方法的测试 泛型接口的测试集合的嵌套遍历 案例一案例二 集合嵌套案例(英雄联... 查看详情

java泛型知识总结篇(代码片段)

泛型与内部类非静态内部类会自动继承外围类泛型参数,对于非静态内部类,无需再次声明泛型参数静态内部类不会自动继承外围类泛型参数(事实上,Node中的泛型参数与MyLinkedList中的没有任何联系,只是这里使用相同的符号T而... 查看详情

java泛型

1.可以利用Object类实现泛型,但这种方法必须进行强制类型转换,容易出错。2.泛型类就是把数据类型参数化。3.泛型类的参数可以是泛型类。4.泛型类可以同时设置多个类型参数。5.泛型类可以继承泛型类。6.泛型类可以实现泛型... 查看详情

java中的泛型方法

java中的泛型方法:是否拥有泛型方法。与其所在的类是否泛型没有关系。泛型的声明,必须在方法的修饰符(public,static,final,abstract等)之后。返回值声明之前。和泛型类一样,能够声明多个泛型,用逗号隔开。一个st... 查看详情

非泛型类的泛型类方法

】非泛型类的泛型类方法【英文标题】:Genericclassmethodonnon-genericclass【发布时间】:2021-02-1616:56:16【问题描述】:我正在尝试在非泛型类上创建一个方法,该方法会创建另一个泛型类并返回它。fromdataclassesimportdataclassfromtypingimpor... 查看详情

java进阶之泛型

泛型的优点泛型类型可以提高可靠性和可读性泛型可以参数化类型泛型可以让我们在编译时而不是在运行时检测出错误泛型类或方法允许用户指定可以和这些类或方法一起工作的对象类型(相容的对象)泛型类ArrayList、泛型接口... 查看详情

java之泛型

1、为什么要有泛型Generic?2、总结Java中的泛型,只在编译阶段有效。在编译过程中,正确检验泛型结果后,会将泛型的相关信息擦出,并且在对象进入和离开方法的边界处添加类型检查和类型转换的方法。也就是说,泛型信息不... 查看详情