5

この 2 つのメソッドの両方を同じクラスに持つことができないのはなぜですか?

public double foo(ArrayList<Integer>  x);
public double foo(ArrayList<Double>  d);
4

3 に答える 3

4

Java がジェネリクスを実装したとき、バイトコードの下位互換性を確保するために、タイプ erasureを考え出しました。これは、実行時に一般的な情報が失われていることを意味します。したがって、署名は実際には次のとおりです。

public double foo(ArrayList  x);
public double foo(ArrayList  d);

同じシグネチャを持つ 2 つのメソッドがあります。

ここでの解決策は、メソッド名をオーバーロードしないことです。2 つのメソッドに異なる名前を付けます。

これは、型 erase に関する Java Generics Tutorial Pageです。

于 2013-06-11T21:05:28.223 に答える
1

問題は、両方のメソッドが同じメソッド シグネチャを持っていることです。メソッドをオーバーロードするには、名前と戻り値の型が同じである必要がありますが、メソッド シグネチャが異なる必要があります。両方のメソッドが配列リストを受け入れる場合です。

于 2013-06-11T21:09:18.670 に答える
-2

次のように変更してみてはいかがでしょうか。

public double fooInteger(ArrayList<Integer>  x);
public double fooDouble(ArrayList<Double>  d);

2 番目の配列の名前を変更するまで、アプレットで同様の問題が発生しました。

于 2013-06-11T21:06:02.853 に答える