Java 中使用 varargs 参数重载方法时出现编译器错误

Compiler error in method overloading with varags argument in Java

我有两个这样的函数:

String getMessage(String code, Object... objects);
String getMessage(Locale locale, String code, Object... objects);

然后我尝试调用第一个不带 varags 参数的函数:

myClass.getMessage("online.order");

我得到这个编译器错误:

Error: java: incompatible types: java.lang.String cannot be converted to java.util.Locale

它试图使用第二个功能,我不明白为什么?

更新:代码上下文

这是定义这两个函数的接口:

public interface MyMessageProvider {
    String getMessage(String code, Object... objects);
    String getMessage(Locale locale, String code, Object... objects);
}

这是实现该接口并扩展 Spring ReloadableResourceBundleMessageSource

的实际 class
public class CustomMessageSource extends ReloadableResourceBundleMessageSource implements MyMessageProvider {
    public static final String BEAN_NAME = "messageSource";

    public static CustomMessageSource getInstance() {
        return (CustomMessageSource) SpringApplicationContext.getBean(BEAN_NAME);
    }

    @Override
    public String getMessage(String code, Object[] objects) {
        return getMessage(getCurrentLocale(), code, objects);
    }

    @Override
    public String getMessage(Locale locale, String code, Object... objects) {
        return getMessage(code, objects, code, locale);
    }
}

然后我在 class 中调用 getMessage,如下所示:

public class MyService {
    @Autowired
    private CustomMessageSource messageSource;

    public String createSomeMessage(){
        messageSource.getMessage("online.order");
    }

}

我可以通过将 String getMessage(String code) 添加到 interface/implementation 来解决问题。编译错误对我来说和你们一样没有意义。但是,我遇到了编译错误!

重写方法的签名略微更改了

的父方法签名
public String getMessage(String code, Object... objects)

public String getMessage(String code, Object[] objects)

对于编译器来说,没关系,它认为 Object... 应该转换为 Object[] 并会进行转换(编译阶段完成后,有没有任何 Object... 东西)。

而对我们来说,这很重要。我们必须完全遵循方法签名。要调用该方法,您必须传递一个数组或 null 那里:

instance.getMessage("code", new Object[]{});
instance.getMessage("code", null);

天哪!我自己发现了这个问题。问题出在实现 class 中,我覆盖了

String getMessage(String code, Object... objects);

String getMessage(String code, Object[] objects)

它工作正常,没有任何问题,但是当我想在没有任何 varags 参数的情况下调用 getMessage 时,覆盖无法处理它。