Java中StringBuilder的insert方法参数不匹配报错原因求解
Java StringBuilder.insert方法编译参数不匹配问题底层原因
核心前提
- 你代码中
flag是Map<Long, Integer>类型,因此flag.get(a)的返回值是Integer包装类型,而非int基本类型。 - JDK中
StringBuilder的insert方法存在多个双参数重载,和本次问题相关的有:insert(int offset, char c):在指定偏移位置插入char字符insert(int offset, int i):在指定偏移位置插入int类型的十进制字符串形式insert(int offset, String str):在指定偏移位置插入字符串
- Java方法重载匹配遵循三个阶段的优先级规则:
- 第一阶段:不允许自动拆装箱、不允许可变参数,仅通过直接类型匹配查找方法
- 第二阶段:允许自动拆装箱、不允许可变参数,查找匹配方法
- 第三阶段:允许自动拆装箱和可变参数,查找匹配方法
原代码编译报错的原因
你原代码的调用逻辑为insert(Integer类型值, char类型值):
- 第一阶段匹配时,不允许自动拆箱,
Integer无法直接匹配insert方法第一个参数要求的int基本类型,第一阶段无匹配方法。 - 进入第二阶段允许自动拆箱后,
Integer可以拆为int,但第二个char参数存在多个合法匹配路径:- 路径1:
char不做任何转换,匹配insert(int, char) - 路径2:
char自动拓宽为int类型,匹配insert(int, int)
编译器无法判定两个路径的优先级,因此报参数不匹配错误。
- 路径1:
两种修复方案的原理
方案1:调用intValue()显式拆箱
flag.get(a).intValue()会将Integer包装类型显式转为int基本类型,此时调用参数为(int, char),可以直接精准匹配insert(int, char)重载,无任何歧义,编译通过。
方案2:将'('改为"("
当第二个参数为String类型时,仅存在insert(int, String)一个合法重载,没有其他候选匹配路径,编译器会自动将第一个参数的Integer拆箱为int,无歧义,编译通过。
内容的提问来源于stack exchange,提问作者user17119889
相关产品推荐
相关产品推荐

