2015-11-19 20 views
10

私はJavaの初心者です。今日私は "Thinking in Java"のコードを見ましたが、コンパイル時にエラーが発生する理由を理解できません。可変引数でオーバーロードするとメソッドが曖昧になる

コード:

public class OverloadingVarargs2 { 
    static void f(float i, Character... args) { 
     System.out.println("first"); 
    } 
    static void f(Character... args) { 
     System.out.println("second"); 
    } 
    public static void main(String[] args) { 
     f(1, 'a'); 
     f('a', 'b'); 
    } 
} 

コンパイルが訴え:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    The method f(float, Character[]) is ambiguous for the type OverloadingVarargs2 

答えて

12

問題は、どちらの方法は、彼らは両方のthird and final phase of overloading resolutionで考慮されることを意味可変引数引数を、持っているf('a', 'b');

です。

'a'charであり、Widening Primitive Conversionで自動的にfloatに変換されます。

'a''b'両方がBoxing Conversionを用いCharactercharから変換することができます。

は、そのための両方f(float i, Character... args)f(Character... args)は引数'a''b'に適用可能であり、それらのどれも他よりも優先されません。

3

f('a', 'b'); 

'a'はintに変換され、したがって、最初のf()に浮かぶように渡すことができるので、これはトラブルの原因となります。

6

ステートメントf('a', 'b');は、コンパイラが呼び出す正確なメソッドを推測できないため、あいまいです。

これは、charプリミティブ型が数値であるとみなされる理由です(各文字には0から65535までの対応する非負整数値があります)。パラメータは、その後、その後Characterにautoboxedれるべき文字'a'ためfloatまたは'a'スタンドにキャストする必要があります97の整数値、の略'a'場合、コンパイラが推測することができない理由である

関連する問題