Java中不使用抑制注解消除unchecked警告的方法(JSONAssert场景)
解决JsonAssert中ValueMatcher未检查赋值警告的方案
这个警告出现的核心原因是ValueMatcher是泛型接口,你直接使用lambda表达式时,编译器无法自动推断出正确的泛型参数类型,只能退化为原始类型(raw type),从而触发未检查赋值的警告。不用@SuppressWarnings的话,我们可以通过显式指定泛型类型来彻底解决这个问题,下面给你几种适配当前场景的干净写法:
方案1:直接在lambda前指定泛型类型
最直接的方式就是在lambda表达式的类型转换中明确指定ValueMatcher<Object>,告诉编译器这个匹配器的泛型参数是Object(兼容JSON中time字段可能的数值类型):
import org.json.JSONException; import org.junit.Test; import org.skyscreamer.jsonassert.*; import org.skyscreamer.jsonassert.comparator.CustomComparator; public class TestClass { @Test public void jsonCompareTest() throws JSONException { JSONAssert.assertEquals("{x: 1, time:123}", "{x: 1, time:234}", new CustomComparator(JSONCompareMode.LENIENT, Customization.customization("time", (ValueMatcher<Object>) (o1, o2) -> true))); } }
方案2:提前定义泛型匹配器实例
把匹配器单独抽成一个变量,显式声明为ValueMatcher<Object>类型,再传入customization方法,代码可读性会更好:
import org.json.JSONException; import org.junit.Test; import org.skyscreamer.jsonassert.*; import org.skyscreamer.jsonassert.comparator.CustomComparator; public class TestClass { @Test public void jsonCompareTest() throws JSONException { // 显式声明泛型类型的匹配器 ValueMatcher<Object> ignoreTimeMatcher = (o1, o2) -> true; JSONAssert.assertEquals("{x: 1, time:123}", "{x: 1, time:234}", new CustomComparator(JSONCompareMode.LENIENT, Customization.customization("time", ignoreTimeMatcher))); } }
方案3:使用方法引用(更具扩展性)
如果后续需要修改忽略time字段的逻辑,可以把匹配逻辑抽成一个静态方法,然后用方法引用传入,同样能避免警告:
import org.json.JSONException; import org.junit.Test; import org.skyscreamer.jsonassert.*; import org.skyscreamer.jsonassert.comparator.CustomComparator; public class TestClass { @Test public void jsonCompareTest() throws JSONException { JSONAssert.assertEquals("{x: 1, time:123}", "{x: 1, time:234}", new CustomComparator(JSONCompareMode.LENIENT, Customization.customization("time", TestClass::ignoreTimeValue))); } // 显式声明参数类型为Object,匹配ValueMatcher<Object>的泛型要求 private static boolean ignoreTimeValue(Object actual, Object expected) { return true; } }
这三种写法都能让编译器明确知道ValueMatcher的泛型参数类型,彻底消除未检查赋值的警告,同时保持代码的整洁性,不需要依赖抑制注解。
内容的提问来源于stack exchange,提问作者Saffik
相关产品推荐
相关产品推荐

