Java泛型<T> T与T的使用方法详解

 更新时间:2020年07月02日 09:46:16   投稿:yaominghui  
这篇文章主要介绍了Java泛型<T> T与T的使用方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类。可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法的形式参数是运行时传递的值的占位符一样。
在集合框架(Collection framework)中泛型的身影随处可见。例如,Map 类允许向一个 Map 类型的实例添加任意类的对象,即使最常见的情况在给定映射(map)中保存一个string键值对。

命名类型参数

对于常见的泛型模式,推荐的泛型类型变量:

  • E:元素(Element),多用于java集合框架
  • K:关键字(Key)
  • N:数字(Number)
  • T:类型(Type)
  • V:值(Value)

大家都知道,Java的泛型是伪泛型,这是因为Java在编译期间,所有的泛型信息都会被擦除,正确理解泛型概念的首要前提是理解类型擦除。Java 泛型是如何工作的?什么是类型擦除?答:泛型是通过类型擦除来实现的,编译器在编译时擦除了所有泛型类型相关的信息,所以在运行时不存在任何泛型类型相关的信息,譬如 List<Integer> 在运行时仅用一个 List 来表示,这样做的动机是兼容 Java 1.5 之前版本。

泛型擦除具体来说就是在编译成字节码时首先进行类型检查,然后进行类型擦除(即所有类型参数都用他们的限定类型替换,包括类、变量和方法),最后如果类型擦除和多态性发生冲突,就在子类中使用桥接方法解决;如果调用泛型方法的返回类型被擦除,则在调用该方法时插入强制类型转换。在类型擦除中,编译器确保不会创建额外的类,并且没有运行时开销。

类型擦除原则

  • 用通用类型的类型参数替换其绑定的有界类型参数;
  • 如果使用无界类型参数,则使用Object替换类型参数;
  • 插入类型转换以实现类型安全;
  • 生成桥接方法以在扩展通用类型中保持多态。

<T> T 和T的区别:T是Type的首字母缩写;<T> T 表示“返回值”是一个泛型,传入什么类型,就返回什么类型;而单独的“T”表示限制传入的参数类型。

<T> T 的用法

这个<T> T 表示返回值T的类型是泛型,T是一个占位符,用来告诉编译器,这个东西是先给我留着, 等我编译的时候再告诉你是什么类型。

import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
public class Demo {
  public static void main(String[] args) {
    Demo demo = new Demo();
    //获取string类型
    List<String> array = new ArrayList<String>();
    array.add("test");
    array.add("doub");
    String str = demo.getListFisrt(array);
    System.out.println(str);
    //获取Integer类型
    List<Integer> nums = new ArrayList<Integer>();
    nums.add(31);
    nums.add(32);
    Integer num = demo.getListFisrt(nums);
    System.out.println(num);
  }

  /**
   * 这个<T> T 可以传入任何类型的List
   * 关于参数T
   * 第一个 表示是泛型
   * 第二个 表示返回的是T类型的数据
   * 第三个 限制参数类型为T
   *
   * @param data
   * @return
   */
  private <T> T getListFisrt(List<T> data) {
    if (CollectionUtils.isEmpty(data)) {
      return null;
    }
    return data.get(0);
  }
}

T 的用法

单独的T表示限制参数的类型。这种用法一般多用于共同操作一个类对象,然后获取里面的集合信息。

import java.util.ArrayList;
import java.util.List;

public class Demo2<T> {

  public static void main(String[] args) {
    //限制T 为String 类型
    Demo2<String> demo = new Demo2<String>();
    List<String> array = new ArrayList<String>();
    array.add("Tom");
    array.add("河南");
    String str = demo.getListFisrt(array);
    System.out.println(str);

    //获取Integer类型
    Demo2<Integer> demo2 = new Demo2<Integer>();
    List<Integer> nums = new ArrayList<Integer>();
    nums.add(12);
    nums.add(13);
    Integer num = demo2.getListFisrt(nums);
    System.out.println(num);
  }

  /**
   * 这个只能传递T类型的数据
   * 返回值 就是Demo<T> 实例化传递的对象类型
   *
   * @param data
   * @return
   */
  private T getListFisrt(List<T> data) {
    if (data == null || data.size() == 0) {
      return null;
    }
    return data.get(0);
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • JAVA使用ElasticSearch查询in和not in的实现方式

    JAVA使用ElasticSearch查询in和not in的实现方式

    今天小编就为大家分享一篇关于JAVA使用Elasticsearch查询in和not in的实现方式,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • Ajax+Servlet+jsp显示搜索效果

    Ajax+Servlet+jsp显示搜索效果

    这篇文章主要为大家详细介绍了Ajax+Servlet+jsp显示搜索效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • springboot嵌套子类使用方式—前端与后台开发的注意事项

    springboot嵌套子类使用方式—前端与后台开发的注意事项

    这篇文章主要介绍了springboot嵌套子类使用方式—前端与后台开发的注意事项,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • java分布式基于RestTemplate的使用方法

    java分布式基于RestTemplate的使用方法

    这篇文章主要为大家介绍了java分布式基于RestTemplate的使用方法说明,有需要的朋友可以借鉴参考下希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-02-02
  • Java冒泡排序及优化介绍

    Java冒泡排序及优化介绍

    大家好,本篇文章主要讲的是Java冒泡排序及优化介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • spring源码学习之bean的初始化以及循环引用

    spring源码学习之bean的初始化以及循环引用

    这篇文章主要给大家介绍了关于spring源码学习之bean的初始化以及循环引用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Jmeter访问需要登录的接口如何处理问题

    Jmeter访问需要登录的接口如何处理问题

    这篇文章主要介绍了Jmeter访问需要登录的接口如何处理问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • 关于SpringCloud灰度发布的实现

    关于SpringCloud灰度发布的实现

    这篇文章主要介绍了关于SpringCloud灰度发布的实现,灰度发布又称金丝雀发布,是在系统升级的时候能够平滑过渡的一种发布方式,灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证其影响度,需要的朋友可以参考下
    2023-08-08
  • java 输入一个数字组成的数组(输出该数组的最大值和最小值)

    java 输入一个数字组成的数组(输出该数组的最大值和最小值)

    这篇文章主要介绍了java 输入一个数字组成的数组,输出该数组的最大值和最小值,需要的朋友可以参考下
    2017-02-02
  • Java类的继承原理与用法分析

    Java类的继承原理与用法分析

    这篇文章主要介绍了Java类的继承原理与用法,结合实例形式分析了java类的继承相关原理、使用方法及操作注意事项,需要的朋友可以参考下
    2020-02-02

最新评论