java中应避免使用原始类型,必须显式指定泛型参数以保障编译期类型安全;常见修复方式包括ide自动补全、正则替换构造器、封装适配方法,并通过编译参数与sonarqube规则强化管控。

Java中使用原始类型(Raw Types)会丢失泛型类型信息,导致编译时无法做类型检查,容易引发运行时 ClassCastException。SonarQube 提示 “Raw types should not be used” 是在提醒你:所有泛型类或接口的引用都应明确指定类型参数,不能省略。
识别所有原始类型用法
原始类型常见于集合、工具类、自定义泛型类等场景,例如:
-
List list = new ArrayList();→ 应改为List<string> list = new ArrayList();</string> -
Map map = new HashMap();→ 应改为Map<string integer> map = new HashMap();</string> -
Set set = getSomeSet();(返回值是Set>或未声明泛型)→ 需确认实际元素类型并补全 - 泛型方法调用未指定类型参数:
Utils.parse(...)而不是Utils.<user>parse(...)</user>
批量修复策略(IDE + 脚本辅助)
手动逐行改效率低且易漏,推荐组合方式:
-
IntelliJ IDEA:启用
Inspection→ “Raw use of parameterized class”,勾选“Show warnings for raw types”,再用Alt+Enter快速修正(自动推断类型或提示补全) - Eclipse:启用 “Generic type problems” 检查,配合 “Quick Fix”(Ctrl+1)一键添加类型参数
- 对
new ArrayList()/new HashMap()等构造器调用,可用正则替换(谨慎使用):
查找:new ArrayList\(\)→ 替换为:new ArrayList<object>()</object>(后续再按上下文细化)
查找:new HashMap\(\)→ 替换为:new HashMap<object object>()</object> - 对于方法返回值为原始类型的调用(如
someMethod()返回List),必须结合上下文判断实际类型,不能盲目加<object></object>;建议先补上@SuppressWarnings("rawtypes")临时压制,再逐步清理
处理泛型擦除与遗留 API
有些老框架(如早期 Spring、MyBatis)API 返回原始类型,或第三方库未提供泛型声明。此时需:
- 优先升级依赖版本(如 MyBatis 3.4+、Spring 5+ 已大量补全泛型)
- 对无法升级的 API,用显式类型转换 +
@SuppressWarnings("unchecked"),但必须配注释说明原因和类型依据 - 封装一层适配方法,将原始类型转为带泛型的包装类,例如:
public static <t> List<t> toList(Iterable<t> iterable) { ... }</t></t></t>
预防机制与团队规范
重构后防止回潮:
- 在
pom.xml中配置 Maven Compiler Plugin 强制启用泛型检查:<compilerargs><arg>-Xlint:unchecked</arg></compilerargs> - 在 SonarQube 中启用规则
java:S1665(Raw types should not be used),并设为 Blocker 级别 - CI 流程中加入
mvn compile -Dmaven.compiler.source=8 -Dmaven.compiler.target=8,确保编译阶段暴露问题 - Code Review Checklist 明确要求:所有泛型类/接口/方法调用必须带类型参数,禁止
ArrayList、Map等裸名出现
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











