16

これが許可されず、同じ署名として扱われないのはなぜですか?

public Object myMethod(Map<String, String[]> values) {
   return this;
}

public Object myMethod(Map<String, String> values) {
   return this;
}
4

2 に答える 2

16

都市伝説の答えは次のとおりです。

型を消去すると、ジェネリック情報が失われるためです。実行時には、これらのメソッドは同一に見えます。

Map<X, Y>になりますMap

しかし、実際の答えはもっと複雑に見えます。重複した質問からのこの優れた回答を参照してください。コンパイラは、提供された引数が与えられた場合に、オーバーロードされた正しいメソッドを実際に選択することができますが、従来の非ジェネリック認識コードをサポートする必要があるため、開発者はそれを禁止せざるを得ませんでした。javac

于 2013-04-04T08:56:00.013 に答える
6

これはType Erasureによるものです。Type Erasure は、コンパイル時にほとんどのジェネリック情報を削除します。したがって、コンパイル後の上記のコードは次のようになります

public Object myMethod(Map values) {
   return this;
}

public Object myMethod(Map values) {
   return this;
}

したがって、両方のメソッドは実行時に同一です。

于 2013-04-04T08:57:25.667 に答える