0
class Overload{

  public static void main(String args[]) {
    int[]  number={1,2,3,4,5,6,7,8,9,10};   
    int [] num={1,2,3,4,5};
    int i;
    int sum=0;
    sum = f(number);   
    int sum1= f(num);
    System.out.println("The sum is" +sum + ".");
    System.out.println("The sum is" +sum1 + ".");
  }

  public static int f(int[] value) {
    int i, total = 0;
    for(i=0; i<10; i++) {
      total = total + value[ i ];
    }
    return (total);
  }

  public static int f(int... x) {
    int i, total = 0;
    for(i=0; i<10; i++) {
      total = total + x[ i ];
    }
    return (total);
  }

}

上記のプログラムをコンパイルしているときに、次のようなエラーが発生します

C:\Program Files\Java\jdk1.7.0_09\bin>javac Overload.java
Overload.java:30: エラー: オーバーロードで f(int...) と f(int[]) の両方を宣言することはできません
public static int f(int... x)
4

4 に答える 4

4
public static int f(int... x)

に他なりません: -

public static int f(int[] x)

必ずしも引数を渡す必要がないという唯一の違いがあります。また、個々の要素を渡すと、内部で配列に変換されます。したがって、実際にはarrayのみを渡しています。

一方、後者には引数が必要です。少なくとも空の配列。

また、配列を引数として渡す場合、両方のメソッドを呼び出すことができます。

だから呼び出し:

f(new int[] {1, 2});

どちらの方法でも可能です。したがって、あいまいさがあります。


ただし、f(5)呼び出しは最初のメソッドに対してのみ行うことができます。なので、5配列型には代入できません。したがって、あいまいさは、配列を渡すときにのみ発生します。

于 2012-11-20T17:14:28.517 に答える
1

あなたのコンパイラは、可変引数を引数として取るメソッドは、配列を引数として取るメソッドと同じかもしれないと考えています。つまり、同じ数の引数を持つ重複したメソッドがあると見なし、オーバーロードの規則に違反します。

public void m1(int[] arr){

}

public void m1(int...i){

}

は基本的に同じです。唯一の違いは、var-argsが任意の数の int 変数を受け入れることができることです。

于 2012-11-20T17:14:18.437 に答える
0

メソッドのシグネチャは同じです。したがって、過負荷は不可能です。メソッドのシグネチャを変更します。

ウィキペディアから Java のメソッド シグネチャの定義があります。

Java プログラミング言語では、メソッド シグネチャはメソッド名とそのパラメータの数と型です。戻り値の型とスローされた例外は、メソッド シグネチャの一部とは見なされません。

コードには、同じ署名を持つ 2 つのメソッドがありますf(int[] value)。別の関数がint...引数として使用していますが、それは と同等int[]です。

于 2012-11-20T17:21:48.797 に答える