Groovy中java.util.LinkedHashMap#leftShift方法重载歧义问题求助
解决LinkedHashMap#leftShift方法重载歧义的Groovy错误
问题重现
我编写了调用API的getInfo方法:
public def getInfo(String A, String B, String C, String D, String E) { def response = null; def requestHeaders = ['A': A, 'B' : B] requestHeaders << headers Map uriVariables = [C : C, D : D, start: 1, end: 10, E: E] try { response = restMethod.get(getInfo, uriVariables, requestHeaders, [:]) if(!response) { return null; } } catch (e) { logger.error("Error getting data", e) } return response?.data ? response?.data : null }
同时编写了用于测试的getInfoTest方法:
@CrossOrigin @RequestMapping(method = RequestMethod.GET, path = '/getInfo') def getInfoTest(@RequestHeader('A') String A, @RequestHeader('B') String B, @RequestHeader('C') String C, @RequestHeader('D') String D, @RequestHeader('E') String E) { infoResponse = InfoRestClient.getInfo(A, B, C, D, E) return infoResponse }
调用时出现以下错误:
groovy.lang.GroovyRuntimeException: Ambiguous method overloading for method java.util.LinkedHashMap#leftShift. Cannot resolve which method to invoke for [null] due to overlapping prototypes between: [interface java.util.Map] [interface java.util.Map$Entry]
错误原因
错误出在getInfo方法的requestHeaders << headers这一行:
当headers变量的值为null时,Groovy无法确定要调用LinkedHashMap的哪个leftShift重载方法——该类有两个重载的leftShift方法,分别接受Map和Map.Entry类型参数,而null同时匹配这两个类型的参数,导致方法调用歧义。
修复方案
方案1:先判断null再执行合并
在合并headers前先检查其是否为null,避免传入null触发歧义:
def requestHeaders = ['A': A, 'B' : B] if (headers != null) { requestHeaders << headers }
方案2:使用putAll结合默认空Map
利用Groovy的Elvis操作符,当headers为null时用空Map替代,再通过putAll方法合并(putAll仅接受Map类型参数,不存在重载歧义):
def requestHeaders = ['A': A, 'B' : B] requestHeaders.putAll(headers ?: [:])
额外说明
你之前怀疑的同名函数问题并非本次错误的原因,错误完全源于headers变量为null时的Map合并操作,调整getInfoTest的参数无法解决该问题,核心是处理getInfo方法中headers的null情况。
内容的提问来源于stack exchange,提问作者jasper
相关产品推荐
相关产品推荐

