You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用ArchUnit实现禁止方法参数来自禁用包的规则?

解决ArchUnit中notHaveRawParameterTypes的编译错误问题

核心原因

notHaveRawReturnType针对单个返回类型做断言(参数为DescribedPredicate<? super JavaClass>),而notHaveRawParameterTypes针对整个方法的参数类型列表做断言(参数为DescribedPredicate<? super List<JavaClass>>),直接复用返回类型的断言会因为类型不匹配导致编译失败。

解决方案

根据你的检查需求,有两种常见实现方式:

方式1:检查所有参数都满足指定条件

如果要确保方法的所有参数都不是目标raw类型,需要将单个参数的断言转换为对参数列表的断言,使用DescribedPredicate.forList()方法包装:

// 定义单个参数的断言:不是raw类型的List
DescribedPredicate<JavaClass> notRawList = rawType(List.class).negate();

// 将单个参数断言转换为列表断言:所有参数都满足notRawList
DescribedPredicate<List<JavaClass>> allParametersNotRawList = DescribedPredicate.forList(all(notRawList));

// 构建规则:指定包下的方法,所有参数都不能是raw类型的List
ArchRule parameterRule = methods()
    .that().areDeclaredInClassesThat().resideInAPackage("com.your.package")
    .should(notHaveRawParameterTypes(allParametersNotRawList));

方式2:检查特定位置的参数

如果只需要检查某个特定位置的参数(比如第一个参数),可以直接使用haveRawParameterTypeAtPosition()方法,无需处理列表断言:

// 构建规则:指定包下的方法,第一个参数不能是raw类型的List
ArchRule firstParameterRule = methods()
    .that().areDeclaredInClassesThat().resideInAPackage("com.your.package")
    .and().haveParameterCountGreaterThanOrEqualTo(1) // 确保方法有至少一个参数
    .should(haveRawParameterTypeAtPosition(0, rawType(List.class)).negate());

扩展说明

  • 如果需要检查存在任意参数满足条件,将all(notRawList)替换为any(notRawList)即可
  • 可以替换rawType(List.class)为你需要检查的任意类型,比如rawType(Map.class)等

内容的提问来源于stack exchange,提问作者Zartc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 17:57:39