avatar

十六小站

欢迎来到我的个人主页! 期待与您分享我的经验与故事,一起探索技术的无穷可能!

  • 首页
  • NAS专题
  • 关于
Home 泛型踩坑
文章

泛型踩坑

Posted 2024-04-2 Updated 2024-10- 19
By 十六 已删除用户
5~6 min read

泛型是一种在编程语言中用来创建可重用代码的机制。它允许您编写函数、类、接口等,而不需要提前指定具体的数据类型,从而实现代码的通用性和灵活性。通过使用泛型,您可以编写更加通用、安全和易于维护的代码。

1. 泛型的定义

泛型是一种参数化类型的概念,允许您在编写代码时定义类、接口或方法可以操作的数据类型。通过泛型,您可以编写通用的代码,使其能够适用于多种数据类型,而不需要为每种数据类型都编写特定的代码。

2. 泛型的优势

代码重用性:通过泛型,您可以编写一次代码,然后在多种数据类型上重复使用,避免了重复编写类似的代码。 类型安全:泛型能够在编译时进行类型检查,避免了在运行时出现类型转换错误,提高了代码的可靠性。 减少代码冗余:使用泛型可以减少冗余代码的编写,使代码更加简洁和易于维护。 增强代码的可读性和可维护性:泛型代码通常更具有可读性,因为它们清晰地表明了代码的意图和用途。

3. 泛型的应用场景

集合类:Java中的集合类(如List、Set、Map等)都使用了泛型,使得集合能够存储特定类型的元素。 类和接口:您可以定义泛型类和接口,以便在实例化时指定具体的类型。 方法:泛型方法允许您在方法中使用泛型类型,从而实现更通用的方法。

4. 泛型的工作原理

在Java中,泛型是通过类型擦除来实现的,即在编译时会擦除泛型类型信息,将泛型类型替换为其边界类型(或Object类型)。这样可以确保向后兼容性,并在运行时不会保留泛型类型信息。

5. 踩坑

理解了以上知识后,我们进入本文的重要环节。先来说下博主遇到的问题。先上代码:

/**
*接口
**/
public interface MenberService<T> {
List<T> search(Class cls, SearchRequest searchRequest);
public int deleteBatch(List<String> ids);
}
/**
*实现类
**/
public class MenberServiceImpl implements MenberService {
List<T> search(Class cls, SearchRequest searchRequest){
//此处省略了方法体
return null;
}
public int deleteBatch(List<String> ids){
//此处省略了方法体
return 0;
}
}

代码看上去是没什么问题,但是如果在开发工具中就会看到实现类报错了, file 报错中可以看出由于泛型类型未被正确指出,导致入参中的泛型类型被擦除后也无法被编译器识别。

5. 解决方法

在实现类中需要指明实现类中的泛型类型,因为T是一个泛指,在编译后会被替换成实际的类型。这里我们先指定成Object,方法如下

/**
*实现类
**/
public class MenberServiceImpl implements MenberService<Object> {
List<T> search(Class cls, SearchRequest searchRequest){
//此处省略了方法体
return null;
}
public int deleteBatch(List<String> ids){
//此处省略了方法体
return 0;
}
}

这样,编译器是可以直达我们类中的泛型为Object,所以在方法的入参中我们是可以指定其他类型的泛型。

后端, 菜鸟入坑
Java
License:  CC BY 4.0
Share

Further Reading

Sep 30, 2025

微服务之Auth篇

auth服务重要是认证授权,签发jwt token使用。 生成密钥对 # 在项目 src/main/resources 下生成 jwt.jks(演示用,生产用更严格的密码/keystore) keytool -genkeypair \ -alias jwt \ -keyalg RSA \

Sep 6, 2025

SpringBoot3.X-2(缓存Redis/memory)

本文主要是实现缓存的集成,由于是单体项目 ,目前整合了内存缓存和Redis缓存两种,可以通过配置来切换。 引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-sta

Sep 5, 2025

SpringBoot3.X-1(MP+Druid)

本次基于springboot-3.5.5,先附上文档地址:https://docs.spring.io/spring-boot/reference/data/sql.html 初始化springboot项目 项目创建步骤不做记录 集成mybaits-plus</

OLDER

OpenSearch集成

NEWER

node版本管理工具

Recently Updated

  • KubeShpere部署(4.1.2)
  • 微服务之Auth篇
  • 记一次前端优化(vue2)
  • SpringBoot3.X-2(缓存Redis/memory)
  • SpringBoot3.X-1(MP+Druid)

Trending Tags

Java Docker 前端 中间件 数据库 群晖 unraid

Contents

©2025 十六小站. Some rights reserved.

Using the Halo theme Chirpy