2016-11-18 2 views
1

にvarags引数でのオーバーロードエラー:コンパイラエラーは、私はこのような二つの機能を持っているJavaの

なぜ2番目の機能を使用しようとしていますか?

更新:コードのコンテキスト

これは、これら二つの機能を定義するインターフェースである。

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

これは、インターフェイスを実装し、またスプリング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)をインターフェイス/実装に追加することで問題を解決できます。コンパイルエラーは皆さんと同じように私には意味を与えません。しかし、私はコンパイルエラーを取得しています!

+1

あなたのビルドは最新のものですか?同じエラーが表示される場合は、 'Project - > Clean'を実行してください。もう少し文脈では[edit]してください。上記のコードは記述されていないエラーを生成しません。 –

+1

@MattClark、私はプロジェクトをきれいにしましたが、私は同じコンパイルエラーが発生しています。私が今までに見つけた唯一の解決策は、新しい関数 'String getMessage(String code)'を定義し、その内部の最初の関数をvaragsとしてnullで呼び出すことです。 – Arashsoft

+0

が奇妙に見える、最初のメソッドが呼び出される必要があります、他のオーバーロードされたメソッドはありますか? – Andrew

答えて

3

オーバーライドされたメソッドのシグネチャは少しコンパイラについて

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

から

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

に親のメソッドのシグネチャを変更し、それは問題ではない、それはそのはずのものとしてObject...を考慮Object[]に変換され、その変換が行われます(コンパイル段階が完了した後、Object...のものはありません)。

私たちにとっては、それは問題ですが。メソッドシグネチャに厳密に従わなければなりません。

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

はい、私は同時にこの問題を発見しました:)しかし、コンパイラはこの問題については何も教えていませんでした/ – Arashsoft

+0

@Arashsoft、 'Object ...'と 'Object []'は等しいと見なします。問題。 – Andrew

+0

しかし、この投稿は、それらが等しくないことを示しています。それはコンパイラのバグです:) – Arashsoft

0

OMG:メソッドを呼び出すには、配列やそこnullに合格する必要があります!私は自分自身で問題を発見した。問題は、私はそれがすべての問題のない正常に動作しますが、私はどのvarags引数なしのgetMessageを呼び出したいとき、オーバーライドがそれを扱うことができない

String getMessage(String code, Object[] objects) 

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

をオーバーライド実装クラスです。

関連する問題