半小时通透Java的泛型

yizhihongxing

半小时通透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日

相关文章

  • 基于PHP实现通过照片获取ip地址

    基于PHP实现通过照片获取IP地址的攻略 1. 简介 在本攻略中,我们将使用PHP编程语言来实现通过照片获取IP地址的功能。具体来说,我们将利用照片中的元数据信息,提取出其中的位置信息,从而获取到照片拍摄时的IP地址。 2. 步骤 2.1 安装必要的库和工具 首先,我们需要安装以下两个库和工具:- Exif扩展:用于读取照片的元数据信息。- GeoIP库:用…

    other 2023年7月31日
    00
  • linux如何配置bond

    Linux如何配置Bond Bonding技术是一种基于Linux内核,将多个物理网卡进行绑定,实现负载均衡和容错的网络技术。它在企业级网络中得到了广泛的应用,本文将介绍如何在Linux系统中进行Bonding配置。 步骤一:安装依赖工具 在进行Bonding配置之前,需要安装ifenslave工具,ifenslave是集成在Linux内核中的网络加速模块(…

    其他 2023年3月28日
    00
  • bigdecimal乘法保留两位小数

    以下是“BigDecimal乘法保留两位小数”的完整攻略: BigDecimal乘法保留两位小数 在Java中,可以使用BigDecimal类来进行高精度计算。本攻略将介绍如何使用BigDecimal类进行乘法运算,并保留两位小数。 步骤1:创建BigDecimal对象 首先,您需要创建两个BigDecimal对象,表示要进行乘法运算的两个数。以下是创建Bi…

    other 2023年5月7日
    00
  • 深入理解Python中命名空间的查找规则LEGB

    深入理解Python中命名空间的查找规则LEGB 在Python中,命名空间是一个存储变量名称和对应值的地方。当我们在代码中引用一个变量时,Python会按照一定的规则来查找该变量所在的命名空间。这个规则被称为LEGB规则,它是指在Python中查找变量时的四个命名空间,按照以下顺序进行查找: Local(局部)命名空间:这是指函数内部定义的变量。当我们在函…

    other 2023年8月20日
    00
  • Windows server 2008下如何安装应用程序

    安装应用程序的过程可以分为以下几个步骤: 打开服务器管理器 在Windows Server 2008中,可以点击“开始”按钮,找到“管理工具”,然后选择“服务器管理器”来打开该程序。 找到要安装应用程序的服务器 在服务器管理器中,可以找到需要安装应用程序的服务器。在左侧导航栏中,选择“角色”或“功能”,然后在右侧窗口中选择相应的服务器。如果尚未安装该角色或功…

    other 2023年6月25日
    00
  • 魔兽7.0惩戒骑属性优先级该怎么选择_惩戒骑属性收益优先级介绍

    魔兽7.0惩戒骑属性优先级选择攻略 1. 简介 在魔兽世界7.0版本中,惩戒骑士是一种强大的近战攻击职业,其属性的选择对于提升输出能力至关重要。本攻略将会介绍惩戒骑士的属性收益优先级,帮助玩家正确选择和优化属性分配。 2. 属性收益优先级介绍 2.1 主要属性 力量(Strength):主要影响惩戒骑士的攻击强度和物理伤害输出。 爆击(Critical St…

    other 2023年6月28日
    00
  • matplotlib 入门之Image tutorial

    Matplotlib入门之Image Tutorial的完整攻略 本文将为您详细讲解Matplotlib中Image Tutorial的内容,包括图像的读取、显示、处理和保存等内容。在文中,我们将使用Matplotlib 3.4.2版本作为示例。 图像的读取和显示 以下是使用Matplotlib读取和显示图像的步骤: 导入Matplotlib和Numpy库:…

    other 2023年5月6日
    00
  • 什么是神经网络?

    神经网络是一种机器学习模型,通过多层神经元构建实现非线性分类和回归预测。接下来的攻略将详细讲解神经网络的构建过程。 准备工作 在进行神经网络构建之前,需要准备好以下工作: 数据集:神经网络需要大量的训练数据来训练模型,因此需要准备好符合实际的数据集。 环境配置:需要安装好合适的深度学习框架以及相应的包和库,如TensorFlow、Keras等。 数据预处理 …

    其他 2023年4月19日
    00
合作推广
合作推广
分享本页
返回顶部