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 时,覆盖无法处理它。
我有两个这样的函数:
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
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 时,覆盖无法处理它。