深入理解java泛型Generic

深入理解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日

相关文章

  • linux shell awk获得外部变量(变量传值)简介

    当我们编写Linux shell脚本时,有时需要从外部获取变量并在脚本中使用。而awk是Linux环境下非常常用的文本处理工具之一,也可以在其中使用外部变量。本攻略将详细讲解如何在awk中获得外部变量。 准备工作 在学习如何在awk中获取外部变量之前,我们需要先了解一下-v选项。-v选项可以向awk脚本中传递一个变量,并将该变量赋值为一个名为awk的变量。 …

    other 2023年6月27日
    00
  • 使用top命令分析linux系统性能的详解

    使用top命令分析linux系统性能的详解 在Linux系统中,top是最常用的性能监控命令之一。它可以实时显示系统资源的使用情况,包括CPU、内存、进程等。下面是使用top命令分析Linux系统性能的详解。 使用top命令 在Linux系统中,可以通过以下命令打开top: top 或者 top -d <秒数> 其中,-d参数指定top命令的更新…

    other 2023年6月27日
    00
  • IOS开发自定义view方法规范示例

    下面我将为大家分享如何制作iOS开发自定义view的方法规范示例。 什么是自定义view 自定义view是指程序员自己定义的在iOS应用中用来显示内容的视图控件,可以自己控制视图的外观和行为,更灵活地满足业务需求。 自定义view可以具有以下特点: 可以自由定义视图外观 可以自定义视图的交互 可以封装业务逻辑 制作自定义view的步骤 继承UIView类,实…

    other 2023年6月25日
    00
  • flex 简单跑马灯效果(竖着显示)

    下面是实现 flex 简单跑马灯效果(竖着显示)的完整攻略,包括基本原理、实现方法和两个示例说明。 基本原理 flex 简单跑马灯效果(竖着显示)的基本原理是通过 flex 布局实现文字的竖直排列,并通过 CSS 动画实现文字的滚动效果。 实现方法 实现 flex 简单跑马灯效果(竖着显示)的方法如下: 使用 flex 布局实现文字的竖直排列。 使用 CSS…

    other 2023年5月5日
    00
  • 学习python编程发展前途

    学习Python编程发展前途 为什么学习Python编程很有前途? Python是一种高级语言,其代码易于阅读和理解,环境配置简单,同时它支持面向对象编程、函数编程、模块化编程等多种编程范式,是一种十分灵活且强大的编程语言。Python的应用范围非常广,从web开发、网络编程、数据分析、科学计算、机器学习、人工智能等应有尽有。和其他的编程语言相比,Pytho…

    其他 2023年4月16日
    00
  • 大容量的U盘该选择哪一种文件系统格式比较好

    当我们选择U盘的文件系统格式时,应该考虑U盘的容量大小、使用场景、操作系统支持等因素。下面是选择U盘文件系统格式的完整攻略: 1.了解U盘的容量大小和使用场景 U盘的容量通常有8GB、16GB、32GB、64GB等不同规格。如果使用U盘作为文件传输的工具,通常需要存储大量的文件,特别是视频等大文件,因此需要选择支持大容量的文件系统格式。如果使用U盘做系统安装…

    other 2023年6月27日
    00
  • C++使用模板实现单链表

    这里是C++使用模板实现单链表的攻略: 第一步:定义节点类 单链表的每个节点都包含两个部分,一个是数据部分,一个是指向下一个节点的指针。因此我们需要先定义一个节点类,代码如下: template <class T> class Node{ public: Node<T>* next; T data; Node(); Node(cons…

    other 2023年6月27日
    00
  • iOS12 beta6更新了什么 iOS12beta6更新内容及新Bug一览

    iOS 12 Beta 6 更新内容及新 Bug 一览 更新内容 iOS 12 Beta 6 是苹果公司为其移动操作系统 iOS 12 推出的第六个测试版本。以下是该版本的一些更新内容: 性能优化:iOS 12 Beta 6 对系统性能进行了优化,提升了整体的响应速度和流畅度。这意味着在使用 iOS 12 Beta 6 的设备上,用户可以更快地打开应用程序、…

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