Java中泛型的学习

BingBing-8888 / 2024-10-09 / 原文

泛型


目录
  • 泛型
    • 什么是泛型
      • 泛型方法
    • 泛型的作用
    • 泛型的特性
    • 泛型的使用
      • 普通泛型
      • 静态泛型方法

什么是泛型

Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。

泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。

泛型方法

你可以写一个泛型方法,该方法在调用时可以接收不同类型的参数。根据传递给泛型方法的参数类型,编译器适当地处理每一个方法调用。

下面是定义泛型方法的规则:

  • 所有泛型方法声明都有一个类型参数声明部分(由尖括号分隔),该类型参数声明部分在方法返回类型之前(在下面例子中的 )。
  • 每一个类型参数声明部分包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。
  • 类型参数能被用来声明返回值类型,并且能作为泛型方法得到的实际参数类型的占位符。
  • 泛型方法体的声明和其他方法一样。注意类型参数只能代表引用型类型,不能是原始类型(像 int、double、char 等)。
//使用泛型
Map<String,String> map2 = new HashMap();
map2.put("key", "values");
String str2 = map2.get("key");

泛型的作用

ava 语言中,引入泛型实乃为一个较大的功能增强。不仅语言、类型系统和编译器有了较大的变化,以支持泛型,而且类库也进行了大翻修,所以许多重要的类,比如集合框架,都已经成为泛型化的了。作用如下:

1,类型安全。

泛型的主要目标是提高 Java 程序的类型安全。编译时的强类型检查;通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的程度上验证类型假设。没有泛型,这些假设就只存在于程序员的头脑中(或者如果幸运的话,还存在于代码注释中)。

2,消除强制类型转换。

泛型的一个附带好处是,消除源代码中的许多强制类型转换。这使得代码更加可读,并且减少了出错机会。

3,潜在的性能收益。

泛型为较大的优化带来可能。在泛型的初始实现中,编译器将强制类型转换(没有泛型的话,程序员会指定这些强制类型转换)插入生成的字节码中。但是更多类型信息可用于编译器这一事实,为未来版本的 JVM 的优化带来可能。由于泛型的实现方式,支持泛型(几乎)不需要 JVM 或类文件更改。所有工作都在编译器中完成,编译器生成类似于没有泛型(和强制类型转换)时所写的代码,只是更能确保类型安全而已。

Java语言引入泛型的好处是安全简单。泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。

4、更好的代码复用性,比如实现泛型算法

在框架设计时候,BaseDao、BaseService、BaseDaoImpl、BaseServiceImpl;通过继承,实现抽象了所有公共方法,避免了每次都要写相同的代码。

泛型的特性

泛型的使用

普通泛型

声明

/**
 * author : northcastle
 * createTime:2021/10/23
 * 泛型方法的定义
 */
public class GenericMethod {

    //1.普通的泛型方法
    public <T> String commonMethod(String name,T t){
        String res = "";
        res += name +"-"+ t;
        System.out.println("普通泛型方法 : "+res);
        return res;
    }
}

调用

/**
 * author : northcastle
 * createTime:2021/10/23
 */
public class GenericMethodApplication {
    public static void main(String[] args) {
        //1.调用普通泛型方法
        GenericMethod genericMethod = new GenericMethod();
        String commonRes01 = genericMethod.commonMethod("001", "bb");
        System.out.println(commonRes01);
        String commonRes02 = genericMethod.commonMethod("002", 100);
        System.out.println(commonRes02);
        String commonRes03 = genericMethod.commonMethod("003", true);
        System.out.println(commonRes03);
        System.out.println("==================");
    }
}

静态泛型方法

声明

/**
 * author : northcastle
 * createTime:2021/10/23
 * 泛型方法的定义
 */
public class GenericMethod {

    //2.静态的泛型方法
    public static <T,E> String staticMethod(String name,T t,E e){
        String res = "";
        res += name +"-"+ t +"-"+ e;
        System.out.println("静态泛型方法 : "+res);
        return res;
    }
}

调用

package com.northcastle.genericmethod;

/**
 * author : northcastle
 * createTime:2021/10/23
 */
public class GenericMethodApplication {
    public static void main(String[] args) {
     
        //2.调用静态泛型方法
        String staticRes01 = GenericMethod.staticMethod("001", "aa", "bb");
        System.out.println(staticRes01);
        String staticRes02 = GenericMethod.staticMethod("002", 100, 'c');
        System.out.println(staticRes02);
        String staticRes03 = GenericMethod.staticMethod("003", 12.05d, false);
        System.out.println(staticRes03);
        System.out.println("==================");
   
    }
}

泛型可变参数

声明

/**
 * author : northcastle
 * createTime:2021/10/23
 * 泛型方法的定义
 */
public class GenericMethod {

    //3.带可变参数的泛型方法
    public <A> void argsMethod(A ... args){
        for (A arg : args) {
            System.out.println(arg);
        }
    }
}

调用

package com.northcastle.genericmethod;

/**
 * author : northcastle
 * createTime:2021/10/23
 */
public class GenericMethodApplication {
    public static void main(String[] args) {
     
        //3.调用可变参数的方法
        genericMethod.argsMethod(1,2,300,400,500,600);
        System.out.println("==================");
    }
}