深入理解java泛型Generic

yizhihongxing

深入理解Java泛型

Java泛型是Java语言中的重要特性之一,在编写Java程序时经常被使用。本文将介绍Java泛型的相关知识点,包括泛型类、泛型方法、通配符、类型擦除等内容。本文将帮助读者更深入地理解Java泛型。

泛型类

泛型类是指在定义其时使用了类型参数的类,通过类型参数来实现对不同类型的支持。泛型类定义的语法如下:

public class GenericClass<T> {
    private T value;
    public void setValue(T value) {
        this.value = value;
    }
    public T getValue() {
        return this.value;
    }
}

在上述代码中,GenericClass 是一个泛型类,使用了类型参数 T。在实例化泛型类时,可以指定 T 的具体类型,例如:

GenericClass<String> gc = new GenericClass<String>();
gc.setValue("hello");
String value = gc.getValue();

在上述代码中,实例化了一个 GenericClass 对象,其中的类型参数 T 被指定为 String 类型。通过 setValue 方法设置了一个字符串值,通过 getValue 方法获取了该字符串值。

泛型方法

与泛型类类似,Java中还可以定义泛型方法,通过泛型方法可以在不同的方法中使用类型参数实现对不同类型的支持。

public class GenericMethod {
    public <T> void print(T value) {
        System.out.println(value.getClass().getSimpleName() + ": " + value);
    }
}

在上述代码中,定义了一个 print 方法,使用了类型参数 T,通过 value.getClass().getSimpleName() 可以获得该参数的类型的类名,然后通过 System.out.println 输出。

GenericMethod gm = new GenericMethod();
gm.print("hello");
gm.print(123);

上述代码中,创建了一个 GenericMethod 对象,分别调用了 print 方法,传递了一个字符串和一个整数类型参数。

通配符

通配符是在泛型中使用的一种特殊符号,它可以表示任意类型的参数。

上限通配符

上限通配符使用 extends 关键字来限制泛型类型参数的类型上限。例如:

public void print(List<? extends Number> list) {
    for (Number n : list) {
        System.out.println(n);
    }
}

上述代码中,使用 List<? extends Number> 来声明方法参数 list 的类型,该声明表示参数类型为 Number 或其子类型的 List 对象。

下限通配符

下限通配符使用 super 关键字来限制泛型类型参数的类型下限。例如:

public void add(List<? super Integer> list) {
    list.add(new Integer(10));
}

上述代码中,使用 List<? super Integer> 来声明方法参数 list 的类型,该声明表示参数类型为 Integer 或其超类型的 List 对象。

类型擦除

Java泛型实现的机制是类型擦除,编译器通过泛型类和泛型方法的特殊写法,来将类型参数在编译时期擦除,并在运行时期中使用 Object 类型来代替泛型类型参数。这种机制的本质上是为了保证兼容性和适应旧版本的Java代码。

上述介绍了Java泛型中的一些关键知识点,通过学习本文可以更深入地理解Java泛型,体验Java泛型的强大之处,开发出更加高效和功能强大的Java应用程序。

示例一:

public class Point<T> {
    private T x;
    private T y;

    public Point(T x, T y) {
        this.x = x;
        this.y = y;
    }

    public T getX() {
        return x;
    }

    public T getY() {
        return y;
    }

    public static void main(String[] args) {
        Point<Integer> point = new Point<>(10, 20);
        int x = point.getX();
        int y = point.getY();
        System.out.println("Point(" + x + ", " + y + ")");
    }
}

以上代码中定义了一个泛型类Point,它的参数T可以将x和y同时定义成整型、浮点型等类型。在main函数中通过将类带参数Integer实例化并使用getX和getY属性可把Point类中的x和y的值转换为整型,便于进行相关的计算操作。

示例二:

public class Utils {
    public static <T> T find(T[] array, T value) {
        for (T item : array) {
            if (item.equals(value)) {
                return item;
            }
        }
        return null;
    }

    public static void main(String[] args) {
        String[] array = {"hello", "world", "java"};
        String res = find(array, "world");
        System.out.println(res);
    }
}

以上代码中定义了一个工具类Utils,它的泛型方法find可以查找数组中是否包含指定的元素,并返回该元素本身,返回值类型也是泛型类型T。在main函数中实例化字符串数组array和一个字符串value,将array和value作为参数传入find方法中进行查找,查找到“world”字符串后返回该元素本身。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入理解java泛型Generic - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • 电脑一开机就自动重启怎么解决有哪些方法

    电脑一开机就自动重启,是一种比较常见的问题,往往是由于硬件或软件故障引起的。本篇攻略将介绍如何解决这个问题,并提供两个实例说明。 诊断问题 首先,我们需要确认问题的原因。电脑自动重启的原因可能有很多,包括: 硬件故障,如电源、内存、硬盘、显卡等 软件问题,如操作系统的错误、驱动程序的故障、恶意软件感染等 BIOS设置问题 为了确定问题的原因,我们需要进行诊断…

    other 2023年6月27日
    00
  • gtx750ti和gtx1030哪款值得入手 gtx750ti和gtx1030对比评测

    GTX 750 Ti vs GTX 1030 对比评测 性能对比 指标 GTX 750 Ti GTX 1030 架构 Maxwell Pascal CUDA 核心数 640 384 基础频率 1020 MHz 1227 MHz Boost 频率 1085 MHz 1468 MHz 显存容量 2 GB GDDR5 2 GB GDDR5 显存频率 5400 MH…

    other 2023年10月16日
    00
  • 家里的电脑ip怎么实现与公司IP地址切换?

    家里的电脑IP切换攻略 在家里的电脑上实现与公司IP地址的切换,可以通过以下步骤完成: 步骤一:了解公司网络设置 首先,你需要了解公司网络的设置,包括公司的IP地址范围、子网掩码、网关和DNS服务器等信息。这些信息通常由公司的网络管理员提供。 步骤二:配置家庭网络 在家里的电脑上,你需要配置一个新的网络连接,以便与公司网络进行切换。以下是配置家庭网络的步骤:…

    other 2023年7月29日
    00
  • iPhone6空间越来越小怎么办 空间清理技巧

    iPhone 6 空间清理技巧攻略 如果你的 iPhone 6 的可用空间越来越小,以下是一些空间清理技巧,可以帮助你释放存储空间并优化设备性能。 1. 删除不需要的应用程序和游戏 应用程序和游戏通常占据大量的存储空间。检查你的 iPhone 6 上安装的应用程序和游戏,并删除你不再使用或不需要的。以下是一个示例: 打开 iPhone 主屏幕,长按不需要的应…

    other 2023年8月2日
    00
  • Python批量安装卸载1000个apk的方法

    Python批量安装卸载1000个APK的方法 在Python中,我们可以使用subprocess模块来执行命令行操作,从而实现批量安装和卸载APK的功能。以下是详细的步骤: 导入所需的模块: import subprocess import os 定义APK文件夹路径和ADB命令路径: apk_folder = \"/path/to/apk/fo…

    other 2023年10月13日
    00
  • MySQL数据库表约束讲解

    MySQL数据库表约束是指在创建或修改表结构时,对列的数据类型、长度、取值范围等做出的限制或规范。它可以确保数据的正确性、完整性和安全性。常见的约束包括NULL、NOT NULL、PRIMARY KEY、FOREIGN KEY、UNIQUE、CHECK等。下面就一一介绍这些约束: 1. NULL与NOT NULL NULL表示空值。如果列允许为NULL,则该…

    other 2023年6月25日
    00
  • 批处理的高级运用技巧

    当我们在批处理中需要更高级的操作时,我们可以使用一些高级技巧来实现我们的需求。下面是几个常用的高级技巧: 1. 使用变量 批处理中的变量使用 % 符号来表示。我们可以使用变量来存储要操作的文件名、目录名、字符串等信息。在批处理中,使用 set 命令来定义变量。例如,要定义一个名为 filename 的变量,可以使用以下命令: set filename=&qu…

    other 2023年6月26日
    00
  • 深入C++拷贝构造函数的总结详解

    深入C++拷贝构造函数的总结详解 什么是拷贝构造函数 在 C++ 中,每个类都有至少一个构造函数,负责创建这个类的对象。其中,拷贝构造函数是一种特殊的构造函数,它负责用一个已经存在的对象来初始化一个新的对象。拷贝构造函数的原型为: 类名(const 类名 &obj) 其中,obj 是需要拷贝的对象的引用。 拷贝构造函数的调用时机 当一个对象需要复制到…

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部