メソッド消去のあいまいさ: Java が同様のメソッド シグネチャを制限する理由
Java コンパイラは、「メソッド add(Set) には同じ消去があります」というエラーがスローされます同一のジェネリック型 Erasure を持つ 2 つのメソッドが同じ内で宣言されている場合、Test 型の別のメソッドとして add(Set) を実行します。 class:
class Test { void add(Set<Integer> ii) {} void add(Set<String> ss) {} }
この制限は、生の型を使用する従来のコードでの競合を回避したいという要望から生じています。ジェネリックスが導入される前は、メソッドは次のような生の型を受け取り、返しました。
class CollectionConverter { List toList(Collection c) {...} }
ジェネリックスの導入後にそのようなクラスを拡張する場合、言語設計者は生の型がジェネリック型と「オーバーライド同等」であるとみなしていました。これにより、シグネチャを変更せずにメソッドをオーバーライドできるようになり、下位互換性が確保されました。
ただし、異なるジェネリック シグネチャを持つ複数のメソッドが許可されると、生の型がまだ使用されている場合にあいまいさが生じる可能性があります。たとえば、クラスがスーパークラス メソッドをオーバーライドする既存の raw メソッドにジェネリック メソッドを追加した場合、コンパイラはどのメソッドを呼び出すかを解決できません。
この潜在的な混乱を避けるために、Java ではクラスが次のメソッドを使用することを禁止しています。
このルールは、異なるジェネリック セット型を渡すようなシナリオでは不便に見えるかもしれませんが、維持するために必要な安全策です。従来のコードとの互換性。これがないと、ジェネリックスを使用するようにコードをアップグレードすると、生の型に依存する既存のコードが壊れる可能性があります。
以上がJava が同一のジェネリック型消去を持つメソッドを制限するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。