java泛型基本知识和通用方法

Java泛型基本知识和通用方法攻略

1. 泛型的概念

泛型是Java 5中引入的一个新特性,它是为了解决在使用集合时发现的类型安全问题而设计的。泛型的本质就是参数化类型,即将类型作为参数传递。

在使用泛型时,需要知道以下几个关键字:

  • 类型参数:使用尖括号<>括起来的类型名称,可以是任何标识符,但通常使用单个大写字母(如TEK表示Key、V表示Value等)表示泛型类型。
  • 泛型类:带有泛型类型参数的类,例如List<T>
  • 泛型方法:带有泛型类型参数的方法,例如<T> T getInstance(Class<T> clazz)

2. 基本语法

泛型的基本语法是在类型后面添加尖括号<>,并将泛型类型参数放在其中,例如:

public class MyClass<T> {
    // ...
}

在使用泛型类时,需要指定具体的泛型类型,例如:

MyClass<String> instance = new MyClass<String>();

这里将MyClass的泛型类型参数T指定为String,这样在使用MyClass类的方法时,就可以直接传入String类型的参数。

3. 泛型的通配符

通配符用于表示泛型类型的未知实参。有时候我们需要在使用泛型类时,对泛型类型的范围进行限制,这时候就可以使用通配符。通配符有两种,一种是?表示可以接受任何类型的实参,另一种是? extends 类型,表示可以接受所有该类型以及其子类型的实参。

例如:

public void printList(List<?> list) {
    for (Object obj : list) {
        System.out.println(obj);
    }
}

这里使用了?通配符表示可以接受任何类型的List对象,如果使用List<String>List<Integer>等具体类型的实参都是可以的。

4. 泛型的限定

泛型的限定是指对泛型类型参数的取值范围进行限制,主要有以下两种:

  • 上限限定:使用extends关键字限制泛型类型参数的上限,表示只能接受该类型及其子类型的实参。
  • 下限限定:使用super关键字限制泛型类型参数的下限,表示只能接受该类型及其父类型的实参。

例如:

public <T extends Number> T addList(List<T> list) {
    // ...
}

public void printList(List<? super Integer> list) {
    // ...
}

第一个方法中,使用了extends关键字限制泛型类型参数T必须是Number及其子类,这样就可以在方法中调用Number及其子类的方法。

第二个方法中,使用了super关键字限制泛型类型参数?必须是Integer及其父类,这样就可以将Integer对象及其父类对象添加到List中。

5. 示例说明

示例一:泛型类的定义和使用

public class Pair<T, V> {
    private T first;
    private V second;

    public Pair(T first, V second) {
        this.first = first;
        this.second = second;
    }

    public T getFirst() {
        return first;
    }

    public V getSecond() {
        return second;
    }

    public void setFirst(T first) {
        this.first = first;
    }

    public void setSecond(V second) {
        this.second = second;
    }
}

// 使用泛型类Pair
Pair<String, Integer> pair = new Pair<>("Hello", 123);
System.out.println(pair.getFirst()); // 输出"Hello"
System.out.println(pair.getSecond()); // 输出123

在这个例子中,我们定义了一个泛型类Pair,它有两个泛型类型参数TV,分别表示成对出现的两个元素的类型。在使用泛型类时,可以指定具体的泛型类型来实例化一个对象,例如Pair<String, Integer>表示第一个元素为String,第二个元素为Integer

示例二:泛型方法与通配符的使用

public class Utils {
    public static <T> T max(List<? extends T> list) {
        if (list == null || list.isEmpty()) {
            return null;
        }
        T result = list.get(0);
        for (T item : list) {
            if (item.compareTo(result) > 0) {
                result = item;
            }
        }
        return result;
    }
}

// 使用泛型方法
List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5);
Integer max1 = Utils.max(list1);
System.out.println(max1); // 输出5

List<String> list2 = Arrays.asList("apple", "banana", "orange");
String max2 = Utils.max(list2);
System.out.println(max2); // 输出"orange"

在这个例子中,我们定义了一个泛型方法max,它接受一个List对象,并使用通配符<? extends T>限制该对象的类型范围为T及其子类。在方法中,使用类型参数T表示返回值的类型,并使用compareTo方法比较列表中的元素大小。在使用泛型方法时,可以直接传入一个List<Integer>List<String>等具体类型的参数,返回值会根据具体类型而确定。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java泛型基本知识和通用方法 - Python技术站

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

相关文章

  • Android ViewDragHelper完全解析 自定义ViewGroup神器

    Android ViewDragHelper完全解析 自定义ViewGroup神器 简介 在Android开发中,我们经常需要实现一些自定义的ViewGroup,其中一个常见的需求是实现拖拽功能。Android提供了一个强大的工具类——ViewDragHelper,可以帮助我们轻松实现拖拽功能。本文将详细介绍ViewDragHelper的使用方法,并提供两个…

    other 2023年8月21日
    00
  • Android如何在Gradle中更改APK文件名详解

    如果你想在构建Android工程时修改APK文件名,可以通过以下方式实现: 步骤1:打开build.gradle文件 在你的Android工程目录下,打开build.gradle文件,一般有两个文件,一个是app/build.gradle,另一个是project/build.gradle。我们需要修改的是app/build.gradle文件。 步骤2:添加如…

    other 2023年6月26日
    00
  • field.setaccessible()方法

    以下是Field.setAccessible()方法的完整攻略,包括两个示例说明。 1. Field.setAccessible()方法 Field.setAccessible()方法是Java反射API中的一个方法,用于设置字段的可访问性。默认情况下,Java中的字段是私有的,不能从外部访问。使用Field.setAccessible()方法可以绕过这种限…

    other 2023年5月9日
    00
  • 如何解决Word提示无法初始化visual basic环境的问题

    标准化word安装 首先,建议您安装正版的Microsoft Office软件,并且将其完整安装。按照官方的标准安装流程进行操作,不要进行任何过多的自定义操作。完整的安装过程应该会自动安装Visual Basic编程环境和所需的支持文件。 解决措施 如果您的Word已经安装好了,但是出现了无法初始化Visual Basic环境的问题,您可以按照以下步骤进行操…

    other 2023年6月20日
    00
  • python 拷贝特定后缀名文件,并保留原始目录结构的实例

    Python拷贝特定后缀名文件,并保留原始目录结构的实例攻略 在Python中,你可以使用shutil模块来拷贝文件,并使用os模块来处理目录结构。下面是一个完整的攻略,详细讲解了如何拷贝特定后缀名的文件,并保留原始目录结构。 步骤1:导入必要的模块 首先,你需要导入shutil和os模块,以便使用它们的函数和方法。 import shutil import…

    other 2023年8月5日
    00
  • MySQL笔记之系统信息函数详解

    MySQL笔记之系统信息函数详解 MySQL提供了一些系统信息函数,用于获取关于数据库服务器和数据库的各种信息。这些函数可以帮助我们了解数据库的状态、配置和性能等方面的信息。下面是一些常用的系统信息函数的详细说明。 1. VERSION() VERSION()函数返回当前MySQL服务器的版本信息。 示例: SELECT VERSION(); 输出: 5.7…

    other 2023年8月3日
    00
  • Shell脚本中$符号的嵌套使用方法小结

    Shell脚本中$符号的嵌套使用方法小结 在Shell脚本中,$符号是一个非常重要的特殊字符,用于引用变量的值。除了直接使用$变量名来引用变量的值外,$符号还可以嵌套使用,以实现更复杂的功能。下面是关于$符号嵌套使用的一些常见方法和示例说明。 1. 变量替换 使用$符号嵌套可以在字符串中进行变量替换。具体来说,可以使用${变量名}的形式来引用变量,并在变量名…

    other 2023年7月27日
    00
  • oracle序列(查询序列的值 修改序列的值)

    以下是“Oracle序列(查询序列的值 修改序列的值)”的完整攻略,过程中包含两个示例说明的标准格式文本: Oracle序列(查询序列的值 修改序列的值) 在Oracle数据库中,序列是一种用于生成唯一数字的对象。序列可以用于生成主键、唯一标识符等。本文将介绍如何查询序列的值和修改序列的值。 1. 序列的值 查询序列的值可以使用SELECT语句和NEXTVA…

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