2011-06-25 8 views
1
class OverloadingVarargs2 { 
    static void f(float i, Character... args) { 
     System.out.println("first"); 
     System.out.println(i); 
    } 
    static void f(Character... args) { 
     System.out.println("second"); 
    } 
    static void test() { 
     f(1, 'a'); 
     f('b', 'c'); // the method f is ambiguous 
    } 
} 

このコードはコンパイルできません。コンパイラはfがあいまいであると言います。しかし、私は2番目の方法は一致すると思うf('b', 'c');何が問題なのですか?変数argを使用したオーバーロード

答えて

8

これは、そのメソッド呼び出しが変数argsを持つものか、fl​​oatと変数argsを持つものを呼び出すべきかを判断する方法がないためです。

Javaはこのようにwid> boxing> variable argsを呼び出すメソッドで決定しますが、この場合は両方とも可変引数を持ちます。

このシナリオでは、基本的にcharがfloatに拡張されています。

Javaのプリミティブの拡大順序は次のとおりです。

byte -> short -> int -> long -> float -> double 
char -> int -> long -> float -> double 
関連する問題