Java中带varags参数的方法重载中的编译器错误
我有两个类似的功能:Java中带varags参数的方法重载中的编译器错误,java,overloading,variadic-functions,Java,Overloading,Variadic Functions,我有两个类似的功能: String getMessage(String code, Object... objects); String getMessage(Locale locale, String code, Object... objects); public class MyService { @Autowired private CustomMessageSource messageSource; public String createSomeMessa
String getMessage(String code, Object... objects);
String getMessage(Locale locale, String code, Object... objects);
public class MyService {
@Autowired
private CustomMessageSource messageSource;
public String createSomeMessage(){
messageSource.getMessage("online.order");
}
}
我尝试在没有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);
}
这是实现该接口的实际类,并且扩展了SpringReloadableResourceBundleMessageSource
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:
String getMessage(String code, Object... objects);
String getMessage(Locale locale, String code, Object... objects);
public class MyService {
@Autowired
private CustomMessageSource messageSource;
public String createSomeMessage(){
messageSource.getMessage("online.order");
}
}
我可以通过向接口/实现添加
stringgetmessage(stringcode)
来解决这个问题。编译错误对我来说和你们不一样。但是,我得到了编译错误 被重写方法的签名会从
public String getMessage(String code, Object... objects)
到
对于编译器来说,这无关紧要,它将对象…
视为应该转换为对象[]
的对象,并将进行转换(编译阶段完成后,没有任何对象…
东西)
但对我们来说,这确实很重要。我们必须严格遵循方法签名。要调用该方法,必须在此处传递数组或null
:
instance.getMessage("code", new Object[]{});
instance.getMessage("code", null);
天哪!我自己发现了这个问题。问题出在我重写的实现类中
String getMessage(String code, Object... objects);
与
它可以正常工作,没有任何问题,但是当我想在没有任何varags参数的情况下调用getMessage时,重写无法处理它。您确定您的构建是最新的吗?如果在其他上下文中仍然出现相同的错误,请尝试执行
Project->Clean
。上面的代码不会产生所描述的错误。@MattClark,我清理了项目,但仍然得到相同的编译错误。到目前为止,我能找到的唯一解决方案是定义一个新函数String getMessage(String code)
,并使用null作为varags调用其中的第一个函数。看起来很奇怪,第一个方法应该被调用,还有其他重载方法吗?Whelp,您必须在其他上下文中,我刚刚在IDE中尝试过这个方法,我无法重现这个问题。我为这个问题添加了更多的上下文。代码在Spring boot framework中运行。是的,我同时发现了问题:)但是编译器没有告诉我关于这个问题的任何信息/@Arashsoft,它认为Object…
和Object[]
相等,所以重写过程没有出现问题。但是这篇文章表明它们不相等。这是编译器错误:)@Arashsoft,它们不仅在语法上对我们是相等的