博客
关于我
Java泛型中的T与?
阅读量:631 次
发布时间:2019-03-14

本文共 3118 字,大约阅读时间需要 10 分钟。

Java 泛型详解

在Java编程中,泛型是一个强大的工具,用于创建更加灵活、类型安全的类、接口和方法。通过泛型,开发者可以在编译时捕获数据类型的信息,使得代码更安全、更抽象。本文将从基础到高级深入探讨Java泛型的概念、用法及注意事项。

1. 泛型的基本概念

1.1 泛型的定义

在Java中,一个类、接口或方法如果包含泛型类型参数,通常会使用 <-Type> 的形式定义。例如,List<T> 中的 T 是一个类型参数,表示该列表中的元素类型是 T 的实例。而 <?> 表示类型不确定的类,常用于表示未指定具体类型的泛型。

1.2 泛型类型的常见符号

  • E - Element:在集合中,E 用于表示集合中的元素类型。
  • T - TypeT 通常用于表示一个任意的类型,常见于泛型类和接口。
  • K - Key:用于键的类型,常见于映射(如 HashMap)。
  • V - Value:表示值的类型,常见于映射。
  • N - Number:表示数值类型。
  • ? - 可通用的类型参数:用于描述类型不确定的泛型。

1.3 泛型的作用

泛型通过以下方式提升了Java编程的安全性和灵活性:

  • 类型安全性:通过泛型,可以确保集合中的元素类型和操作的一致性,从而减少运行时类型错误的可能性。
  • 代码抽象性:使用泛型可以在编译阶段约束类型,提升代码的可读性和简洁性。
  • 跨平台支持:通过泛型接口和类的定义,Java可以在不同JVM上运行同一代码。
  • 2. 泛型类与接口

    2.1 泛型类的定义

    下面的示例定义了一个简单的泛型类 Box<T>

    public class Box
    { private T data; public Box(T data) { this.data = data; } public T getData() { return data; }}

    在这个类中,<T> 表示该类可以存储任何类型的数据。T 是一个类型参数,可被任何具体的Java类型替换,例如 String, Integer, Object 等。

    2.2 泛型接口的定义

    接口也可以定义泛型。例如,定义一个泛型接口 MyInterface<T>

    public interface MyInterface
    { T getsendKeys();}

    在这个接口中,T 是一个类型参数,表示该接口的实现类需要返回 T 类型的对象。

    2.3 泛型方法的定义

    泛型方法可以在类或接口中定义。例如,下面的方法 processElements 是一个泛型方法:

    public class Utils {    public static 
    void processElements(T[] elements) { for (T element : elements) { // element是T类型的对象 } }}

    在这个方法中,<T> 表示该方法可以接收任何类型的数组 elements。通过泛型方法,可以对不同类型的数据应用相同的逻辑。

    3. 泛型类型的实例化

    3.1 如何创建泛型类的实例

    使用泛型类如 ArrayList 时,可以传递具体的类型参数。例如:

    List
    nameList = new ArrayList
    ();List
    ageList = new ArrayList<>();

    ArrayList 是一个泛型类,其底类型为 List<T>。通过传递 StringInteger 作为类型参数,分别创建了两个通用的列表实例。

    3.2 泛型类型的返回值

    当方法返回一个泛型类型的对象时,返回值会带有具体的类型信息。例如:

    public classRequest2Bean Method:public static 
    T request2Bean(String requestUrl, Class
    clazz) { // 实现具体逻辑...}

    在这个方法中,<T> 表示返回值是一个 T 类型的对象。通过传入具体的 Class<T>,方法会返回一个与该类对应的对象。

    4. 泛型与类型通配符

    4.1 类型通配符的作用

    类型通配符 (?) 表示对类型的不确定。例如,List<?> 表示列表中的元素类型不确定,但仍然保持了类型安全性。下面的例子展示了如何使用类型通配符:

    List
    list = new ArrayList<>();List
    list1 = list; // list1的类型是 List

    通过类型通配符,可以与多个具体类型的列表进行操作,同时保持编译时类型安全。

    4.2 类型通配符的上限与下限

    有时需要对类型通配符施加更严格的限制。例如,可以使用 <? extends Number> 表示通配符只能是 Number 类及其子类:

    List
    numberList = new ArrayList<>();

    而使用 <? super Number> 则表示通配符可以是 Number 的超类:

    List
    superNumberList = new ArrayList<>();

    这些限制保证了方法的参数类型是符合预期的,从而提高了代码的安全性。

    5. 方法中的泛型

    5.1 泛型方法的定义与使用

    方法可以带有泛型参数。例如,下面的方法 getData 是一个泛型方法:

    public class Box
    { public T getData() { return data; }}

    通过调用 getData(), 可以获取 Box<T> 中的数据。T 是一个可替换的类型参数。

    5.2 泛型方法的类型指定

    在调用泛型方法时,可以对类型参数进行明确指定。例如:

    Box
    name = new Box<>();Box
    age = new Box<>();name.getData(); // 返回 String 类型的数据age.getData(); // 返回 Integer 类型的数据

    通过具体化类型参数,使得泛型方法能够更准确地操作数据。

    6. 创建 Class<T> 类型的实例

    在Java中,常见的方式创建 Class<T> 类型的实例是通过 Class.forName() 方法或使用类常量。例如:

    Class
    stringClass = String.class; // 类常量Class
    numberClass = Class.forName("java.lang.Number"); // 使用 Class.forName()

    这些方法返回一个 Class<T> 类型的实例,其中 T 是具体的类型。

    7. 总结

    通过对Java泛型的深入探讨,我们可以得以全面了解其功能与用途。泛型不仅提升了代码的安全性和可读性,还为Java的元编程带来了更高的灵活性。然而,使用泛型时需要仔细管理类型参数,以确保代码的正确性与可维护性。从基础的类型参数到高级的类型通配符,从类的泛型定义到方法的泛型实现,Java的泛型机制为开发者提供了强大的工具。

    转载地址:http://votoz.baihongyu.com/

    你可能感兴趣的文章
    Mysql中varchar类型数字排序不对踩坑记录
    查看>>
    MySQL中一条SQL语句到底是如何执行的呢?
    查看>>
    MySQL中你必须知道的10件事,1.5万字!
    查看>>
    MySQL中使用IN()查询到底走不走索引?
    查看>>
    Mysql中使用存储过程插入decimal和时间数据递增的模拟数据
    查看>>
    MySql中关于geometry类型的数据_空的时候如何插入处理_需用null_空字符串插入会报错_Cannot get geometry object from dat---MySql工作笔记003
    查看>>
    mysql中出现Incorrect DECIMAL value: '0' for column '' at row -1错误解决方案
    查看>>
    mysql中出现Unit mysql.service could not be found 的解决方法
    查看>>
    mysql中出现update-alternatives: 错误: 候选项路径 /etc/mysql/mysql.cnf 不存在 dpkg: 处理软件包 mysql-server-8.0的解决方法(全)
    查看>>
    Mysql中各类锁的机制图文详细解析(全)
    查看>>
    MySQL中地理位置数据扩展geometry的使用心得
    查看>>
    Mysql中存储引擎简介、修改、查询、选择
    查看>>
    Mysql中存储过程、存储函数、自定义函数、变量、流程控制语句、光标/游标、定义条件和处理程序的使用示例
    查看>>
    mysql中实现rownum,对结果进行排序
    查看>>
    mysql中对于数据库的基本操作
    查看>>
    Mysql中常用函数的使用示例
    查看>>
    MySql中怎样使用case-when实现判断查询结果返回
    查看>>
    Mysql中怎样使用update更新某列的数据减去指定值
    查看>>
    Mysql中怎样设置指定ip远程访问连接
    查看>>
    mysql中数据表的基本操作很难嘛,由这个实验来带你从头走一遍
    查看>>