使用Java中的varags参数重载方法时的编译器错误

时间:2016-11-18 18:17:51

标签: java overloading variadic-functions

我有两个这样的功能:

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)来解决问题。编译错误对我来说并不像你们那样。但是,我收到了编译错误!

2 个答案:

答案 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时,覆盖无法处理它。