Java泛型:灵活多变的类型参数化工具

这篇具有很好参考价值的文章主要介绍了Java泛型:灵活多变的类型参数化工具。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Java泛型:灵活多变的类型参数化工具,趣学Java,java,泛型

  • 👑专栏内容:Java
  • ⛪个人主页:子夜的星的主页
  • 💕座右铭:前路未远,步履不停


一、泛型

1、什么是泛型

在传统的编程方法中,类和方法通常被限定为使用特定的类型。这些类型可能是基础的数据类型(如整数、字符等),或者是由程序员自己定义的复杂类型。这种方式在处理单一类型数据时很有效,但当我们需要编写更加灵活、能够适用于多种数据类型的代码时,这种严格的类型限制就变成了一个约束。

泛型,就是为了解决这种限制而生的。简单来说,泛型可以理解为一种“类型模板”,它允许程序员编写的代码能够适应不同的数据类型,而不必为每种可能的数据类型都编写一个新版本。

泛型的厉害之处,就在于它的灵活性和重用性。你可以写一个泛型方法或类,然后在需要的时候用具体的类型去实例化它,比如整数、字符串或者是你自定义的任何类型。这样,你就可以用同一套代码处理不同类型的数据,极大地提高了代码的通用性和可维护性。

2、泛型的语法

泛型的基本语法主要包括以下几个方面:

  1. 泛型类和接口

    • 在类或接口后面加上<T>来声明一个泛型类或接口。
    • T是类型参数,代表一种未指定的类型。在实例化类或接口时,你可以用具体的类型替换它。
    • 示例:
      public class Box<T> {
          private T t;
      
          public void set(T t) {
              this.t = t;
          }
      
          public T get() {
              return t;
          }
      }
      

    这个例子中,Box类可以用任何类型的对象来实例化,例如Box<Integer>Box<String>

  2. 泛型方法

    • 泛型方法可以定义在普通类中,也可以定义在泛型类中。
    • 在方法返回类型之前使用<T>来声明一个泛型方法。
    • 示例:
      public <T> T genericMethod(T t) {
          return t;
      }
      

    这个方法可以接受任何类型的参数,并返回相同类型的对象。

  3. 类型通配符

    • 使用?表示未知类型,通常用在参数、字段、局部变量上,以及泛型方法的返回类型上。
    • 示例:
      public void processElements(List<?> elements) {
          for (Object e : elements) {
              // 处理e
          }
      }
      

    List<?>可以接受任何类型的List

  4. 限定的类型参数

    • 你可以限制类型参数可以接受的类型范围。
    • 使用extends关键字来限定类型参数的上界(即它必须是特定类或接口的子类型)。
    • 示例:
      public <T extends Number> double sum(List<T> numbers) {
          double sum = 0.0;
          for (Number n : numbers) {
              sum += n.doubleValue();
          }
          return sum;
      }
      

这个方法只接受Number类型或其子类的List

泛型存在的意义:

  • 在编译的时候,帮我们进行类型的检查。
  • 在编译的时候,帮我们进行类型的转换。

二、泛型类的使用

1、泛型类的语法

泛型类<类型实参> 变量名; // 定义一个泛型类引用

new 泛型类<类型实参>(构造方法实参); // 实例化一个泛型类对象
MyArray<Integer> list = new MyArray<Integer>();

注意:泛型只能接受类,所有的基本数据类型必须使用包装类!

2、泛型如何编译的

2.1、擦除机制

Java泛型:灵活多变的类型参数化工具,趣学Java,java,泛型

在编译时,Java编译器将所有的泛型类型参数替换掉,这个过程就是类型擦除。

  • 泛型类型参数被替换为它们的边界或者Object
  • 如果类型参数是有界的(<T extends Number>),编译器将类型参数替换为它的第一个边界。
  • 如果类型参数是无界的(<T>),编译器将类型参数替换为Object

Java的泛型机制是在编译级别实现的,编译器生成的字节码在运行期间并不包含泛型的类型信息

2.2、为什么不能实例化泛型类型数组

class MyArray<T> {
    public T[] array = (T[])new Object[10];
    public T getPos(int pos) {
        return this.array[pos];
    }
    public void setVal(int pos,T val) {
        this.array[pos] = val;
    }
    public T[] getArray() {
        return array;
    }
}

public class demo1 {
    public static void main(String[] args) {
        MyArray<Integer> myArray1 = new MyArray<>();
        Integer[] strings = myArray1.getArray();
    }
}

Java泛型:灵活多变的类型参数化工具,趣学Java,java,泛型
由于类型擦除的原因,不能直接创建一个泛型数组。类型擦除会将泛型类型参数T替换为Object,这导致了类型不匹配,从而在运行时抛出ClassCastException

3、泛型方法

语法:方法限定符 <类型形参列表> 返回值类型 方法名称(形参列表) { ... }

例子:写一个泛型方法,用于交换数组中两个元素的位置:文章来源地址https://www.toymoban.com/news/detail-788738.html

public class GenericMethodTest {
    // 泛型方法 printArray
    public static < E > void printArray( E[] inputArray ) {
        for(E element : inputArray) {
            System.out.printf("%s ", element);
        }
        System.out.println();
    }

    public static void main(String args[]) {
        // 创建不同类型数组: Integer, Double 和 Character
        Integer[] intArray = { 1, 2, 3, 4, 5 };
        Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 };
        Character[] charArray = { 'H', 'E', 'L', 'L', 'O' };

        System.out.println("整型数组元素为:");
        printArray(intArray);   // 传递一个整型数组

        System.out.println("\n双精度型数组元素为:");
        printArray(doubleArray);   // 传递一个双精度型数组

        System.out.println("\n字符型数组元素为:");
        printArray(charArray);   // 传递一个字符型数组
    }
}

  • 泛型方法可以声明在普通类或泛型类中。
  • 泛型方法的声明包括一个类型参数部分,跟在方法的修饰符和返回类型之前。
  • 类型参数部分是一个尖括号括起来的类型参数列表,如<T>

到了这里,关于Java泛型:灵活多变的类型参数化工具的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深入理解Java泛型:灵活、安全、可重用的编程利器

    Java泛型是一项强大的编程特性,为程序员提供了一种灵活、类型安全、可重用的编码方式。通过泛型,我们能够编写更加通用、适应多种数据类型的代码,从而提高了代码的灵活性和可维护性。在这篇博客中,我们将深入探讨Java泛型的各个方面,并通过具体的例子来展示其

    2024年03月21日
    浏览(40)
  • 【Java 基础篇】Java可变参数:灵活处理不定数量的方法参数

    在Java编程中,可变参数是一项强大的功能,它允许你编写更加灵活的方法,接受不定数量的参数。本文将详细解释Java可变参数的用法、语法以及最佳实践。 可变参数是Java 5引入的一项功能,它允许你在方法中传递不定数量的参数。可变参数用三个点( ... )表示,放置在方

    2024年04月17日
    浏览(33)
  • Java获取泛型类型信息

    根据使用泛型位置的不同可以分为:声明侧泛型、使用侧泛型。 声明侧的泛型信息被记录在Class文件的Constant pool中以Signature的形式保存。而使用侧的泛型信息并没有保存。 声明侧泛型 声明侧泛型包括: 泛型类,或泛型接口的声明 带有泛型参数的成员变量 带有泛型参数的方

    2024年02月09日
    浏览(29)
  • Python列表:灵活多变的数据结构

    在Python 3中,列表是一种有序的集合,它包含了多个元素并且每个元素可以是任意类型的数据。列表使用方括号 [ ] 来表示,其中的元素由逗号 , 分隔开。 首先,我们可以创建一个空的列表: 然后,我们创建一个包含多个元素的列表 序列中的每个值都有对应的位置值,称之为

    2024年02月21日
    浏览(31)
  • Java 基础进阶篇(十)—— 泛型与可变参数

    泛型是 JDK5 中引入的特性,可以在编译阶段约束操作的数据类型,并进行检查。 格式: 数据类型; 好处:统一数据类型。把运行时期的问题提前到了编译期间,避免了强制类型转换可能出现的异常,因为编译阶段类型就能确定下来。 注意: 泛型只能支持引用数据类型 。集合

    2024年02月03日
    浏览(27)
  • 【Java 基础篇】Java类型通配符:解密泛型的神秘面纱

    在Java中,类型通配符(Type Wildcard)是泛型的重要概念之一。它使得我们能够更加灵活地处理泛型类型,使代码更通用且可复用。本文将深入探讨Java类型通配符的用法、语法和最佳实践。 类型通配符是一个用问号 ? 表示的通配符,它可以用于泛型类、方法和通配符边界。类型

    2024年02月07日
    浏览(40)
  • Java中泛型和Object类型 初级进阶教程(一)

    在学习的过程中,常常看到某个类或者接口等中使用 ListT, TestT,其中T的作用是什么呢? 1 在类中使用泛型 2 使用多个泛型 3 在类中使用泛型 4 在方法中使用泛型 5 限制泛型类型 6 通配符 (Wildcard) 总结:泛型和Object类型之间的区别 类型安全: 泛型 T : 泛型提供了编译时类型

    2024年02月01日
    浏览(37)
  • NSubstitute:一个简单易用、灵活多变的.NET单元测试模拟框架

    推荐一个简单易用、灵活多变的.NET单元测试模拟框架,让开发者能够更轻松地进行单元测试。 NSubstitute是一个开源的.NET单元测试模拟类库,该框架设计的主要目标是提供一个简单明了、易用性强、贴近自然语言的模拟测试框架。它使得开发者能够专注于测试工作,而不是纠

    2024年02月07日
    浏览(35)
  • 01 java 学习 数据类型、基础语法、封装、继承、多态、接口、泛型、异常等

    目录 环境搭建和基础知识  什么是JRE: 什么是JDK: 基础数据类型  分支选择if else switch和c一毛一样 for和while循环还有数组基本和c一样 封装 函数调用、传参、命名规范、数组新命名规范 java输入Scanner scanner = new Scanner(System.in); 类的创建和使用以及封装修饰符  构造方法:含义、

    2024年02月11日
    浏览(34)
  • java~用泛型来定义异常类型,避免方法调用时throws异常

    我们一般在底层写方法时,如果方法显示throws异常,那么在调用时,也需要将这个异常throws出来,例如 调用时 如果调用时不显示throws出异常,编译器会报出错误,如下图 调用方法时,不需要再throws Ex了,这种对调用者更友好,如图 在第一个方法中,使用了泛型类型 来定义

    2024年02月21日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包