ホームページ >Java >&#&チュートリアル >Java がジェネリック消去後のメソッド署名の重複を防ぐのはなぜですか?

Java がジェネリック消去後のメソッド署名の重複を防ぐのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-25 16:56:13903ブラウズ

Why Does Java Prevent Method Signature Duplication After Generic Erasure?

メソッド署名の重複と汎用消去

Java では、同じ消去を持つ同じクラス内で 2 つのメソッドを宣言することは許可されません。ジェネリック型に型消去を適用した後。この制限は、生の型を利用する従来のコードと競合する可能性があることから発生します。

次の例を考えてみましょう:

class Test {
   void add(Set<Integer> ii) {}
   void add(Set<String> ss) {}
}

このコードはコンパイル エラーをトリガーします: "Method add(Set)タイプ Test の別のメソッドと同じ消去 add(Set) があります。

この制限の背後にある理論的根拠を理解するために、の進化をたどってみましょう。仮説のコードベース:

当初、Java にジェネリックスが導入される前に、次のコードが記述されていた可能性があります:

class CollectionConverter {
  List toList(Collection c) {...}
}

その後、このクラスの拡張機能が作成されました:

class Overrider extends CollectionConverter {
  List toList(Collection c) {...}
}

ジェネリックの導入により、CollectionConverter クラスは次のようになりました。 updated:

class CollectionConverter {
  <T> List<T> toList(Collection<T> c) {...}
}

ただし、Overrider クラスは変更されません。 toList() メソッドを正しくオーバーライドし続けるために、生の型は生成された型と「オーバーライド同等」であると決定されました。

その後、オーバーライダーの開発者はクラスを更新しようとしましたが、クラスの横に新しいメソッドを追加しました。既存の raw toList() メソッド:

class Overrider extends CollectionConverter {
  @Override
  List toList(Collection c) {...}
  @Override
  <T> List<T> toList(Collection<T> c) {...}
}

生の型のオーバーライド同等性により、両方のメソッドが潜在的にtoList(Collection) メソッド。ただし、この曖昧さはコンパイラで解決する必要がありました。

このような競合を防ぐために、Java 言語では、単一クラス内で同じ消去を持つ複数のメソッドの存在を制限しています。これにより、開発者は、生の型を使用する従来のコードによって生じるあいまいさを導入することなく、自信を持ってメソッドをオーバーライドできるようになります。

以上がJava がジェネリック消去後のメソッド署名の重複を防ぐのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。