我有两个这样的功能:
String getMessage(String code, Object... objects);
String getMessage(Locale locale, String code, Object... objects);
我尝试在没有varags参数的情况下调用第一个函数:
myClass.getMessage("online.order");
我收到此编译器错误:
错误:java:不兼容的类型:java.lang.String无法转换 到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);
}
}
我在这样的类中调用getMessage:
public class MyService {
@Autowired
private CustomMessageSource messageSource;
public String createSomeMessage(){
messageSource.getMessage("online.order");
}
}
我可以通过在接口/实现中添加String getMessage(String code)
来解决问题。编译错误对我来说并不像你们那样。但是,我收到了编译错误!
答案 0 :(得分:3)
重写方法的签名稍微改变了父方法签名
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);
答案 1 :(得分:0)
OMG!我自己发现了这个问题。问题出在我覆盖的实现类
String getMessage(String code, Object... objects);
与
String getMessage(String code, Object[] objects)
它没有任何问题,但是当我想在没有任何varags参数的情况下调用getMessage时,覆盖无法处理它。