• java的泛型


    含义:

    含义:参数化类型。

    注意:泛型只在源代码中存在,在编译之后的字节码文件中,泛型又会被转回原始类型。

    为什么使用泛型?

    • 规定操作的数据类型,避免运行时报错
    • 避免强转

    案例

    下面是没有加泛型的

    1. List arrayList = new ArrayList();
    2. arrayList.add("aaaa");
    3. arrayList.add(100);

    假如我们输出arrayList中的值程序就会报错,为什么呢?因为我们往集合中加入了两种不同类型的数据。那么有没有一种办法能让我们在创建对象的时候就规定好对象可以操作的类型呢?泛型就可以

    加了泛型之后,如果我们往里面加入int类型的数据,程序已经开始报错了。

    1. List<String> arrayList = new ArrayList<String>();
    2. arrayList.add(100); 报错

    在类中使用

    先来看语法

    1. class 类名 <泛型名>{
    2. private 泛型名 泛型变量名;
    3. ....
    4. }

    单单看语法可能回有点晕,实际上就是泛型就像一种数据类型,在创建类的时候指明类中方法操作的数据类型。我们直接看下面案例:

    1. public class Animal<T> {
    2. private T t;
    3. public void Animal(T t){
    4. this.t = t;
    5. }
    6. public T getanimal(){
    7. return t;
    8. }
    9. }
    10. public static void main(String[] args) {
    11. Animal a = new Animal<>(1);
    12. String b = a;//报错,a为Integer类型
    13. System.out.println(a);
    14. Animal str = new Animal<>("test");
    15. System.out.println(str);
    16. }

    我们定义了Animal类中方法的操作的数据类型是T,在new Animal对象的时候指定了操作的方法为Interger或者String;更具需要指定操作的数据类型。

    在接口中使用 

    泛型接口与泛型类的定义及使用基本相同。泛型接口常被用在各种类的生产器中。

    直接看案例

    1. public interface a<T> {
    2. public T test();
    3. }

    目的是要求实现必须被指定为泛型类

    1. class b<T> implements a<T>{
    2. @Override
    3. public T test() {
    4. return null;
    5. }
    6. }

     

    在方法中使用

    在方法中使用会比类中使用更难理解,主要有两个形式。在普通方法中使用泛型和泛型方法。

    泛型方法

    泛型类是在类实例化的时候指定对象操作的数据类型;泛型方法是在调用方法的时候指明方法的操作类型。

    下面定义了一个泛型方法,用来指定返回类型为T。我们可以根据需要返回不同的类型。

    1. public static T getData(boolean b){
    2. if(b){
    3. return (T)"对";
    4. }
    5. else
    6. return (T)(Integer)0;//这里不能是基本数据类型
    7. }
    1. String str = getData(true);
    2. int u = getData(false);
    3. System.out.println(str+u);

    注意:泛型执行的操作类型必须为引用数据类型。

    在普通方法中使用泛型

    在编写类的时候还不不确定要传进取的数据类型时候,可以使用

    语法:

    问号是固定写法

    1. //static void add1(List t)报错。<>必须要是问号
    2. static void add(List t){
    3. }

    案例

    1. /*代表传进去的必须是User的子类*/
    2. static void add1(Listextends User> t){
    3. }
    4. /*代表传进去的必须是User的父类*/
    5. static void add2(Listsuper Studnet> t){
    6. }

  • 相关阅读:
    信息安全公司 DataExpert 利用 OpenText EnCase 解决方案帮助执法部门收集和分析数字证据
    Scala---元组
    rst 格式文档编译方案
    基于微调技术打造自己的私有LLM大模型
    error:03000086:digital envelope routines::initialization error
    给出一组正整数arr,你从第0个数向最后一个数,每个数的值表示你从这个位置可以向右跳跃的最大长度,计算如何以最少的跳跃次数跳到最后一个数。
    编译并调试第一个so动态链接库文件
    Spring Data JPA语法详解
    Dubbo系列之微服务框架整合教程
    Top 5 免费 PDF 转 Word 转换工具
  • 原文地址:https://blog.csdn.net/m0_52261367/article/details/126074990