Java可变参数方法调用警告:最后一个参数类型不匹配求助
解决Java可变参数调用的警告问题
警告原因
你遇到的警告是因为调用toMap方法时,传入的String... searchParamsMap与方法定义的Object... entries可变参数类型不匹配。编译器无法确定你是要将searchParamsMap数组作为单个Object元素传入(可变参数调用),还是作为Object[]数组整体传入(非可变参数调用),因此抛出该警告。
解决方案
方案1:强制转为Object[](推荐)
将调用toMap时的最后一个参数强制转为Object[],明确告诉编译器把整个数组作为非可变参数传入,既符合toMap方法的参数要求,也能彻底消除警告:
super(EntityNotFoundException.generateMessage(clazz.getSimpleName(), toMap(String.class, String.class, (Object[]) searchParamsMap)));
方案2:使用注解压制警告(不推荐)
如果不想修改调用逻辑,可以在构造方法上添加注解临时隐藏警告,但这只是掩盖问题而非从根源解决:
@SuppressWarnings("unchecked") public EntityNotFoundException(Class<?> clazz, String... searchParamsMap) { super(EntityNotFoundException.generateMessage(clazz.getSimpleName(), toMap(String.class, String.class, searchParamsMap))); }
修改后的完整代码
public class EntityNotFoundException extends RuntimeException { public EntityNotFoundException(Class<?> clazz, String... searchParamsMap) { super(EntityNotFoundException.generateMessage(clazz.getSimpleName(), toMap(String.class, String.class, (Object[]) searchParamsMap))); } private static String generateMessage(String entity, Map<String, String> searchParams) { return StringUtils.capitalize(entity) + " was not found for parameters:-> " + searchParams; } private static <K, V> Map<K, V> toMap( Class<K> keyType, Class<V> valueType, Object... entries) { if (entries.length % 2 == 1) throw new IllegalArgumentException("Invalid entries"); return IntStream.range(0, entries.length / 2).map(i -> i * 2) .collect(HashMap::new, (m, i) -> m.put(keyType.cast(entries[i]), valueType.cast(entries[i + 1])), Map::putAll); } }
内容的提问来源于stack exchange,提问作者steve
相关产品推荐
相关产品推荐

