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

作者:yaominghui 时间:2021-07-12 10:58:42 

泛型(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);
 }
}

来源:https://www.cnblogs.com/east7/p/13210761.html

标签:Java,泛型,T
0
投稿

猜你喜欢

  • android自动生成dimens适配文件的图文教程详解(无需Java工具类)

    2023-07-17 12:12:30
  • 深入了解Java ServletContext

    2023-11-08 22:36:27
  • 浅谈Spring中Bean的作用域、生命周期

    2023-11-14 02:44:21
  • 详解Java异常处理中finally子句的运用

    2023-11-29 10:10:30
  • Java结构型设计模式中建造者模式示例详解

    2023-04-24 13:37:31
  • Java jar打包工具使用方法步骤解析

    2023-07-01 12:26:47
  • Spark调优多线程并行处理任务实现方式

    2023-08-21 15:43:53
  • 轻松掌握Java建造者模式

    2023-11-06 15:24:38
  • C++实现的链表类实例

    2023-07-04 08:36:36
  • Opencv EigenFace人脸识别算法详解

    2023-07-21 19:30:17
  • SpringBoot中多环境配置和@Profile注解示例详解

    2023-11-29 05:39:04
  • 浅谈Spring Security LDAP简介

    2022-09-19 20:30:06
  • Android Flutter中Offstage组件的使用教程详解

    2023-08-20 01:01:44
  • Spring Security过滤器链体系的实例详解

    2023-08-25 03:24:15
  • Java之操作Redis案例讲解

    2023-06-18 03:48:41
  • 如何通过SpringBoot实现商城秒杀系统

    2023-11-24 23:02:33
  • springboot嵌套子类使用方式—前端与后台开发的注意事项

    2023-09-16 12:37:22
  • Java DWR内存泄漏问题解决方案

    2022-02-28 02:35:07
  • 5分钟快速学会spring boot整合JdbcTemplate的方法

    2022-04-01 15:56:11
  • 如何利用Jackson序列化忽略指定类型的属性详解

    2023-11-16 09:01:27
  • asp之家 软件编程 m.aspxhome.com