半小时通透Java的泛型

半小时通透Java的泛型

Java中的泛型可以在编译时期强制类型检查,提高代码的可读性和可维护性。本篇文章将通过以下几个方面入门讲解Java的泛型。

为何需要泛型

Java是一门强类型语言,变量在声明时就必须指定数据类型。但是,有些场景下程序员无法确定类型,例如:在集合类中存储对象时,使用Object类型无法满足需求,会导致类型转换错误和代码可读性差。针对这种情况,Java提供了泛型机制,使得程序员可以在编译时期指定具体类型。

泛型语法

Java的泛型使用尖括号<>表示,例如:ArrayList。其中,<>中的内容代表类型参数。泛型支持基本数据类型和引用类型,且可以使用通配符(?)表示不确定的类型。

// 泛型类
public class MyGenericClass<T> {
    private T myGenericField;

    public T getMyGenericField() {
        return myGenericField;
    }

    public void setMyGenericField(T myGenericField) {
        this.myGenericField = myGenericField;
    }
}

// 泛型接口
public interface MyGenericInterface<T> {
    void doSomething(T t);
}

// 泛型方法
public class MyGenericMethod {
    public <T> T genericMethod(T t) {
        return t;
    }
}
  • 泛型类:通过定义一个类型变量T,可以在类中使用该类型变量代表任意类型。
  • 泛型接口:与泛型类类似,用于定义接口的泛型类型。
  • 泛型方法:可以在方法调用时,根据传递的参数类型决定具体的类型。

类型通配符

使用类型通配符(?)来表示不确定的类型。例如:

List<?> list = new ArrayList<String>();
  • ? 代表着未知类型,与Object类似;
  • List<?> 表示可以接收任意类型的List引用变量,也就是说,list可以指向任意类型的List引用变量。

类型通配符主要用于读取集合元素,如:

List<?> list = new ArrayList<String>();
for (Object o : list) {  // 编译不报错
    System.out.println(o);
}

由于list的元素类型未知,因此无法使用具体的类型作为元素变量的类型。

类型上限

Java中可以在通配符后面设置上限,用来限制通配符类型的范围。例如:

public static <E extends Number> void test(List<E> list){
    // 方法体
}

上面的代码中定义了一个方法test,该方法接受的List中元素的类型必须是Number及其子类。例如:

List<Integer> intList = new ArrayList<Integer>();
test(intList); // 可以调用
List<String> strList = new ArrayList<String>();
test(strList); // 编译报错

上限的通配符语法为:<? extends 上限类型>,表示该通配符代表的类型为上限类型或其子类。

类型下限

Java中下限通配符语法为 <? super 下限类型>,其中,下限类型通常是当前类型的父类或自身。使用下限通配符可以向集合中添加元素。

public static void test(List<? super Integer> list, Integer a) {
    list.add(a);
}

上面的代码定义了一个方法test,该方法接受的List中元素的类型必须是Integer或其父类。例如:

List<Number> numberList = new ArrayList<>();
test(numberList, 10); // 可以添加元素

示例1:无界泛型

无界泛型指使用时不指定类型参数的泛型,如List、Map。当未指定类型参数时,泛型将与普通的Collection或Map没有任何区别。例如:

List list = new ArrayList();
list.add("字符串");
list.add(10);

由于未指定类型参数,因此可以添加任意类型的元素。

示例2:泛型方法

泛型方法指在调用方法时传递具体类型参数的方法。例如:

public static <T> List<T> getList(T t) {
    List<T> list = new ArrayList<>();
    list.add(t);
    return list;
}

getList是一个泛型方法,在调用时必须传递具体类型参数。例如:

List<String> stringList = getList("字符串A");
List<Integer> intList = getList(10);

总结

本文主要讲解了Java中的泛型机制。泛型可以在编译时期强制类型检查,提高代码的可读性和可维护性。泛型语法包括泛型类、泛型接口、泛型方法以及类型通配符等。同时,还介绍了类型上限、类型下限的使用方法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:半小时通透Java的泛型 - Python技术站

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

相关文章

  • qt5.15lts(长期支持版本)正式发布

    Qt 5.15 LTS是Qt的长期支持版本,它于2020年5月19日正式发布。本文将详细讲解Qt 5.15 LTS的发布过程和新功能,包括使用方法和示例说明。 Qt 5.15 LTS的发布过程 Qt 5.15 LTS的发布过程如下: 2020年5月19日,Qt 5.15 LTS正式发布。 Qt 5.15 LTS提供了长期支持,将在未来三年内提供错误修复和安全…

    other 2023年5月7日
    00
  • 关于gitadd:gitadd*和gitadd之间有什么区别?

    下面是关于“关于git add: git add * 和 git add . 之间有什么区别?”的完整攻略: 1. git add 命令 在使用 Git 进行版本控制时,git add 命令用于将文件添加到 Git 的暂存区中,以便在提交时将其包含在版本历史记录中。下面是 git add 命令的基本语法: git add [文件名] 2. git add *…

    other 2023年5月7日
    00
  • oracle分组函数之rollup用法

    Oracle分组函数之ROLLUP用法的完整攻略 1. 基本介绍 ROLLUP是Oracle分组函数之一,它可以对查询结果进行多层次的分组汇总。使用ROLLUP可以在一次查询中实现多分组汇总的功能,避免了多次查询的麻烦。 2. 用法 以下是使用ROLLUP的详细用法: 使用ROLLUP对查询结果进行多层次的分组汇总。 SELECT column1, colu…

    other 2023年5月10日
    00
  • vue测试环境打包与生产环境打包文件数量不一致解决方案

    一、问题描述 在使用 Vue.js 进行开发时,一些同学可能遇到过这样的情况:在测试环境下打包出来的文件数量与在生产环境下打包出来的文件数量不一致,并且测试环境下打包出来的文件数量更多。 二、原因分析 造成这个问题的原因比较复杂,主要有以下几点: 1.测试环境下可能会有一些调试和性能分析的代码,比如 source map、开发环境的调试工具等等。 2.在测试…

    other 2023年6月27日
    00
  • 小程序开发实战指南之封装自定义弹窗组件

    下面是关于“小程序开发实战指南之封装自定义弹窗组件”的完整攻略及两条示例说明: 一、封装自定义弹窗组件的目的 在微信小程序开发中,经常需要使用弹窗组件来提醒用户一些信息或让用户进行选择等操作。为了提高代码复用性,并且让开发更加方便快捷,我们需要将弹窗组件进行封装,使其可以更加方便地被其他页面调用使用。 二、封装弹窗组件的步骤 以下是封装自定义弹窗组件的步骤:…

    other 2023年6月25日
    00
  • 0基础学习前端开发的一些建议

    0基础学习前端开发的一些建议 学习前端开发是一个有趣且具有挑战性的过程。对于零基础的学习者来说,以下是一些建议,可以帮助你开始学习前端开发并取得进展。 1. 建立坚实的HTML和CSS基础 HTML和CSS是前端开发的基础。HTML用于创建网页的结构,而CSS用于控制网页的样式。学习这两门语言是你入门前端开发的第一步。 学习HTML标签和语法:了解HTML的…

    other 2023年7月27日
    00
  • cmd 命令行下复制、粘贴的快捷键

    在 cmd 命令行下,复制和粘贴常常需要使用鼠标或右键菜单,不太方便,因此可以使用快捷键来方便地完成这些操作。 下面是 cmd 命令行下常用的复制、粘贴快捷键及其操作步骤: 复制 Ctrl + C:选中要复制的文本或命令行,按下 Ctrl + C 完成复制; 鼠标右键菜单:选中要复制的文本或命令行,右键,选择“复制”即可。 粘贴 Ctrl + V:将之前复制…

    other 2023年6月26日
    00
  • c++类型unsignedlongint

    C++类型unsigned long int详解 在C++中,unsigned long int是一种无符号整数类型,它可以存储大于等于0的整数。本攻略将详细介绍unsigned long int类型的特、使用方法示例。 特点 unsigned long int类型的特点如下: 存储范围:0到4294967295(2的32次方减1)。 占用空间:4个字节(3…

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