我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java泛型的实际应用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java泛型的实际应用

本篇内容介绍了“Java泛型的实际应用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

Java有很多的高级特性,泛型是其中之一,泛型即参数化类型。关于泛型的概念,有很多文章都有介绍,这里就不再过多的介绍了。本文将从实战的角度,来看看泛型在实际项目中的使用

1 泛型在框架中的使用

泛型在框架中及为常见,我们在使用各种框架的时候,都会使用到泛型,具体看下面的例子。

1.1 集合框架中使用泛型

这是最常见的泛型的使用场景,比如下面的代码

List<String> list1 = new ArrayList<>();
List<Integer> list2 = new ArrayList<>();

list1和list2虽然都是列表类型,但是列表里面存的数据可以是String,可以是Integer,也可以是自定义类型。集合中存放的数据,在定义的时候不能确定是什么类型,只有当使用集合时,才能确定放什么类型的数据。所以在集合的定义中,就用泛型来代表集合里面的数据。

1.2 fastjson框架中使用泛型

alibaba的fastjson很多人应该都用过,fastjson很多地方也用到了泛型,比如将json字符串转成对象,如下的例子

// 将userStr字符串映射成UserDto类
String userStr = "{id: '123', name: '张三'}";
UserDto userDto = JSON.parseObject(userStr, UserDto.class);

JSON类中,对parseObject方法的定义,如下

public static <T> T parseObject(String text, Class<T> clazz) {
   return parseObject(text, clazz);
}

parseObject方法中的参数传递用到了泛型,要把json字符串转成什么类,在定义的时候并不知道,只有在用到的时候,才知道具体的类型。

1.3 泛型使用场景总结

综合集合框架和JSON框架的例子,我们可以大概总结出泛型的使用场景,便于理解:不管是数据存储还是参数传递,定义的时候,类型并不确定,只有到使用的时候,才知道具体的类型。所以我们的项目中,如果有用到这种不确定类型的时候,就可以考虑泛型。

当然,泛型还有更多的使用场景,比如泛型接口,这里就不一一举例了。

Java泛型的实际应用

2 泛型的实战应用

2.1 数据的存储使用泛型类

在实际项目开发中,有一种场景:前后端分离时,为了方便前后端的对接,一般会统一定义参数的传递格式和结果的返回格式。以结果返回为例,一般都会定义【返回码】,【返回描述】,【返回数据】等,所以可以定义一个ResponseDto类,如下:

public class ResponseDto {
   
   private String code;

   
   private String message;

   
   private ??? content;

// 省略set get
...
}

【返回码】一般是前后端约好的字符串类型,【返回描述】一般就是字符串类型,【返回数据】就不一定了,如果是查询类的请求,返回的数据就是列表信息,可能还包含分页信息;如果是保存、删除之类的请求,返回的数据可能是一条数据,也可能只是ID,也可能不需要返回数据。所以【返回数据】这个字段就是个不确定的类型,可以定义成泛型。所以我们就可以把ResponseDto类改成下面这样:

public class ResponseDto<T> {
   
   private String code;

   
   private String message;

   
   private T content;
}

使用的方法如下:

// 返回单个UserDto对象
ResponseDto<UserDto> responseDto = new ResponseDto<>();
responseDto.setContent(userDto); // userDto是已有的变量

// 返回UserDto列表
ResponseDto<List<UserDto>> responseDto = new ResponseDto<>();
responseDto.setContent(userDtoList); // userDtoList是已有的变量

// 返回ID
ResponseDto<String> responseDto = new ResponseDto<>();
responseDto.setContent(id); // id是已有的变量

这个类就叫做泛型类。

2.2 参数的传递使用泛型方法

以BeanUtils.copyProperties为例,大家应该对这个方法不陌生,就是将一个实体类中的属性值,拷贝到另一个实体类中。一般我们的使用方法是这样的:

// 功能:将UserDto数据拷贝到User
User user = new User();
BeanUtils.copyProperties(userDto, user); // userDto是已有的变量

但是每次都要写两行代码有点麻烦,要先new一个新的实体类,再往里面拷数据。于是我封装了个通用的工具类

public class CopyUtil {
   
   public static <T> T copy(Object source, Class<T> clazz) {
       if (source == null) {
           return null;
       }
       T obj = null;
       try {
           obj = clazz.newInstance(); // 生成一个实例
       } catch (Exception e) {
           e.printStackTrace();
       }
       BeanUtils.copyProperties(source, obj);
       return obj;
   }
}

同样是上面的例子,用工具类的写如下

User user = CopyUtil.copy(userDto, User.class); // userDto是已有的变量

CopyUtil.copy的定义很类似JSON.parseObject的定义。代码变成了一行,当然,减少一行也不足以将其封装成一个工具类。再来看一个场景,列表的拷贝,用BeanUtils.copyProperties的写法如下

// 功能:将List<UserDto>数据拷贝到List<User>
List<User> userList = new ArrayList<>();
// userDtoList是已有的变量
for (int i = 0, l = userDtoList.size(); i < l; i++) {
   UserDto userDto = userDtoList.get(i);
   User user = new User();
   BeanUtils.copyProperties(userDto, user);
   userList.add(user);
}

这样的代码量就比较多了,并且代码写法比较固定。如果项目中用到列表复制的功能比较多,那就有必要对其进行封装了,如下的copyList方法:

import org.springframework.beans.BeanUtils;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;


public class CopyUtil {

   
   public static <T> List<T> copyList(List source, Class<T> clazz) {
       List<T> target = new ArrayList<>();
       if (!CollectionUtils.isEmpty(source)){
           if (!CollectionUtils.isEmpty(source)){
               for (Object c: source) {
                   T obj = copy(c, clazz);
                   target.add(obj);
               }
           }
       }
       return target;
   }

   
   public static <T> T copy(Object source, Class<T> clazz) {
       if (source == null) {
           return null;
       }
       T obj = null;
       try {
           obj = clazz.newInstance();
       } catch (Exception e) {
           e.printStackTrace();
       }
       BeanUtils.copyProperties(source, obj);
       return obj;
   }
}

用法很简单,还是以上面的列表复制为例,代码就变成这样:

// 功能:将List<UserDto>数据拷贝到List<User>
List<User> userList = CopyUtil.copyList(userDtoList, User.class);

封装成CopyUtil工具类后,不管是单体复制还是列表复制,都只需要一行代码,省去了大量的重复代码,从而提高开发效率,这里的copy方法和copyList方法,就是泛型方法,在方法的参数中使用了泛型。

当然这个工具类有个缺点,就是用到了反射,会牺牲一点性能,不过这点性能对于大部分的项目来说可以忽略不计。

2.3 总结

本文讨论了两种泛型的实战应用,一种是用来存储类型不确定的数据,用到泛型类;一种是用来传递类型不确定的参数,用到了泛型方法。当然,泛型还有更多的用法,比如泛型接口,比较典型的是比较器接口Comparable,这里就不再展开了。

“Java泛型的实际应用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java泛型的实际应用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java泛型怎么应用

本篇内容主要讲解“Java泛型怎么应用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java泛型怎么应用”吧!一、什么是泛型Java 泛型(generics)是 JDK 5 中引入的一个新特性,
2023-06-27

掌握golang泛型的实际运用技巧

深入理解golang泛型的使用方法,需要具体代码示例引言:在众多编程语言中,泛型(Generic)是一种强大的编程工具,可以实现类型的参数化,提高代码的复用性和灵活性。然而,由于历史原因,Go语言一直没有加入对泛型的直接支持,这使得许多开
掌握golang泛型的实际运用技巧
2024-01-20

Java中的泛型怎么应用

本篇内容介绍了“Java中的泛型怎么应用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!泛型概述泛型在java中有很重要的地位,在面向对象编程
2023-06-02

Java中信号量模型的实际应用

本篇内容介绍了“Java中信号量模型的实际应用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Java信号量模型的工作方式如下:线程在运行的过
2023-06-17

C#泛型接口实例应用

这篇文章主要讲解了“C#泛型接口实例应用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#泛型接口实例应用”吧!C# 泛型接口代码//Type parameter T in angle br
2023-06-17

Go泛型应用工厂方法及泛型使用实例分析

本篇内容介绍了“Go泛型应用工厂方法及泛型使用实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!接口实现泛化编程平时我们编写结构体和方法
2023-07-02

Java泛型使用实例分析

本篇内容主要讲解“Java泛型使用实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java泛型使用实例分析”吧!1.概述作为一个面向对象的编程语言,Java可以通过实现一些类,作为我们各种
2023-06-29

golang泛型的函数应用

go 1.18 引入了泛型函数,支持类型参数化,增强了代码可重用性。泛型函数语法为 func 函数名[类型参数] (输入参数 类型参数) 类型参数,可使用类型参数化类型作为输入和返回类型。如 min[t number] (a, b t) t
golang泛型的函数应用
2024-04-29

怎么用Java泛型实现类型擦除

本篇内容主要讲解“怎么用Java泛型实现类型擦除”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用Java泛型实现类型擦除”吧!前言先给大家奉上一道经典的测试题。List l1
2023-06-29

java泛型如何实现

在Java中,泛型是通过使用尖括号来实现的。在类或方法的声明中,可以使用泛型来指定一个或多个类型参数。在类的声明中,可以在类名后面使用尖括号来指定一个或多个类型参数。例如,下面的代码是一个泛型类的声明:public class MyGe
2023-10-27

Java泛型实例分析

这篇文章主要介绍“Java泛型实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java泛型实例分析”文章能帮助大家解决问题。首先,我们来看看泛型Java的经典用法:import java.ut
2023-06-03

java 泛型的详解及实例

java 泛型的详解及实例Java在1.5版本中增加了泛型,在没有泛型之前,从集合中读取每一个对象都需要进行强转,如果一不小心插入了类型错误的对象,在运行时就会报错,给日常开发带来了很多不必要的麻烦,比如以下代码:public class
2023-05-31

java泛型类型的调用和实例化介绍

本篇内容主要讲解“java泛型类型的调用和实例化介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java泛型类型的调用和实例化介绍”吧!1、泛型调用类似于普通方法调用,但你不是把参数传递给方法
2023-06-20

Java中泛型使用实例详解

Java中泛型使用泛型作用:泛型:集合类添加对象不用强转反射机制:将泛型固定的类的所有方法和成员全部显示出来 核心代码:ArrayList ff=new ArrayList();Ls ls1=new Ls("薯片",5f);
2023-05-31

C#泛型如何应用

这篇文章主要介绍“C#泛型如何应用”,在日常操作中,相信很多人在C#泛型如何应用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#泛型如何应用”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!我们在编写C#程
2023-06-17

Java泛型的解析

这期内容当中小编将会给大家带来有关Java泛型的解析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、泛型简介1.1 泛型的概念 所谓泛型,就是允许在定义类、接口时通过一个标识表示类中某个属性的类型或者是
2023-06-15

C#泛型的应用及优点

这篇文章主要介绍“C#泛型的应用及优点”,在日常操作中,相信很多人在C#泛型的应用及优点问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#泛型的应用及优点”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!C#
2023-06-17

编程热搜

目录