原创

Java泛型详解

作者:cndz 围观群众:646 更新于 标签:泛型泛型详解泛型代码示例

简介

Java泛型是JDK5引入的新特性,Java泛型是一种非常重要的编程特性,它可以让我们在编写代码时将类型作为参数进行传递,从而使得编写类型安全的泛型代码成为可能。泛型的出现使得我们能够在编译期间就能检查出类型安全问题,而不是在运行时才发现。Java泛型可以应用于类、接口和方法中,可以让我们编写更加通用的代码,这样我们就不需要为每种数据类型都写一份代码。在本文中,我们将深入探讨Java泛型的相关知识。

作用

泛型的作用在于可以让代码更加通用、灵活和安全。它可以帮助我们避免类型转换异常、提高代码的可读性和维护性。使用泛型可以让我们编写更加通用的代码,这样我们就不需要为每种数据类型都写一份代码。在实际开发中,使用Java泛型可以帮助我们提高代码的可读性和维护性,减少代码重复,提高代码的可扩展性和可复用性。

优点

Java泛型的优点主要有以下几个方面:

  1. 类型安全:泛型可以让我们在编译期间就能发现类型安全问题,而不是在运行时才发现。这可以帮助我们避免类型转换异常等问题,提高代码的可靠性和稳定性。
  2. 代码重用:泛型可以让我们编写更加通用的代码,这样我们就可以避免为每种数据类型都写一份代码。这可以大大减少我们的代码量,提高我们的开发效率。
  3. 可读性和维护性:泛型可以使代码更加易读和易于维护,因为它能够使代码更加清晰和简洁。使用泛型可以帮助我们提高代码的可读性和可维护性,减少代码的复杂度和冗余度。

java中的泛型标记

java 中泛型标记符:

  • E - Element (在集合中使用,因为集合中存放的是元素)
  • T - Type(Java 类)
  • K - Key(键)
  • V - Value(值)
  • N - Number(数值类型)
  • - 表示不确定的 java 类型

泛型使用

Java泛型的使用可以分为三个部分:

  1. 泛型方法:可以在方法中使用泛型,以便在方法调用时传递实际类型。泛型方法的语法如下:
<T> 返回类型 方法名(参数列表) { ... }

举个例子(使用泛型打印不容类型的数组信息,分别以Integer,Double,String类型举例)

public class test
{
    // 泛型方法 printArray
    public static < T > void aryPrint( T[] inputArray )
    {
        // 输出数组元素
        for ( T element : inputArray ){
            System.out.printf( "%s ", element );
        }
        System.out.println();
    }

    public static void main( String args[] )
    {
        // 创建不同类型数组: Integer, Double 和 String
        Integer[] intArray = { 1, 2, 3, 4, 5 };
        Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 };
        String[] strArray ={"hello","word"};

        System.out.println( "整型数组元素为:" );
        aryPrint( intArray  ); // 传递一个整型数组

        System.out.println( "\n双精度型数组元素为:" );
        aryPrint( doubleArray ); // 传递一个双精度型数组

        System.out.println( "\n字符串数组元素为:" );
        aryPrint( strArray ); // 传递一个字符型数组
    }
}

运行结果如下:

运行结果展示图片

可能有时候,你会想限制那些被允许传递到一个类型参数的类型种类范围。比如上面的例子,只允许打印Number以及其子类的数组。首先列出参数类型的名称 后跟extends关键字,最后是他的上界。比如:

public class test
{
    // 泛型方法 printArray
    public static < T extends Number> void aryPrint( T[] inputArray )
    {
        // 输出数组元素
        for ( T element : inputArray ){
            System.out.printf( "%s ", element );
        }
        System.out.println();
    }

    public static void main( String args[] )
    {
        // 创建不同类型数组: Integer, Double 和 String
        Integer[] intArray = { 1, 2, 3, 4, 5 };
        Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 };
        String[] strArray ={"hello","word"};

        System.out.println( "整型数组元素为:" );
        aryPrint( intArray  ); // 传递一个整型数组

        System.out.println( "\n双精度型数组元素为:" );
        aryPrint( doubleArray ); // 传递一个双精度型数组

        System.out.println( "\n字符串数组元素为:" );
        aryPrint( strArray ); // 传递一个字符型数组
    }
}

这个时候下面打印字符串数组的时候讲编译就会有问题。因为我们指定了他的上限必须是Number类。而string类显然不是。

运行结果展示图片

  1. 定义泛型类或接口:泛型类的定义和普通类的定义类似, 只是类名后面添加了类型参数声明部分, 和泛型方法一样,泛型类的类型参数声明部分也包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。因为他们接受一个或多个参数,这些类被称为参数化的类或参数化的类型。 可以使用泛型在类或接口中定义类型参数,以便在使用时传递实际类型。定义泛型类或接口的语法如下:
class 类名<T> { ... }
interface 接口名<T> { ... }

举个例子(定义一个泛型类,打印不懂类型的对象)

public class Test<T> {
    private T obj;

    public Test(T obj) {
        this.obj = obj;
    }

    public T getObj() {
        return obj;
    }

    public void show(Test<?> t) {
        System.out.println(t.getObj());
    }
}

public class Main {
    public static void main(String[] args) {
        Test<String> test1 = new Test<>("Hello");
        Test<Integer> test2 = new Test<>(123);
        Test<Object> test3 = new Test<>(new Object());

        test1.show(test1);
        test1.show(test2);
        test1.show(test3);
    }
}

运行结果如下:

运行结果展示图片

  1. 通配符:可以使用通配符来表示某种类型的所有子类型或超类型。通配符使用”?”来表示,它可以用在以下三种情况中:

  2. 泛型类的声明中:可以使用通配符来表示泛型类的类型参数。

  3. 泛型方法的声明中:可以使用通配符来表示泛型方法的类型参数。
  4. 泛型实例化的过程中:可以使用通配符来表示泛型实例化的类型参数。

总结

Java泛型是一种非常重要的编程特性,它可以使代码更加通用、灵活和安全。使用泛型可以帮助我们避免类型转换异常、提高代码的可读性和维护性。在实际开发中,我们应该尽可能地使用泛型来编写类型安全的代码。同时,我们还应该熟练掌握泛型的使用方法,包括定义泛型类和接口、使用泛型方法和通配符等。只有这样,我们才能更加高效地编写Java程序,提高我们的开发效率和代码的可维护性。