ホームページ > Java > &#&チュートリアル > Java はメソッドの消去によって引き起こされるオーバーロードの競合をどのように防ぐのでしょうか?

Java はメソッドの消去によって引き起こされるオーバーロードの競合をどのように防ぐのでしょうか?

DDD
リリース: 2024-12-17 11:35:24
オリジナル
526 人が閲覧しました

How Does Java Prevent Overload Conflicts Caused by Method Erasure?

メソッド消去によるオーバーロードの回避

Java コードで、2 つのメソッドに同じ消去があることを示すエラーが発生する場合があります。このエラーを理解するには、次の例を考えてください。

class Test {
  void add(Set<Integer> ii) {}
  void add(Set<String> ss) {}
}
ログイン後にコピー

コンパイラは、2 つの add メソッドの消去が同じであることを示すエラーを生成します。これは、型パラメータを削除するために両方のメソッドが消去された後、両方のシグネチャ add(Set) があるためです。

場合によっては、これらのメソッドのロジックが重複する可能性があり、単一のジェネリックで置き換えたくなる可能性があります。次のようなメソッド:

public void add(Set<?> set) {}
ログイン後にコピー

ただし、これは常に可能であるとは限りません。さらに、コンストラクターの名前変更が許可されていないため、これらの型の引数を取る 2 つのコンストラクターを作成しようとすると、このアプローチには問題が生じます。

レガシー コードの互換性

理由同じ消去を持つ複数のメソッドは許可されません。これは、生の型を使用する従来のコードとの互換性を維持するという Java の目標から来ています。たとえば、ジェネリックが導入される前に書かれた次のクラスを考えてみましょう:

class CollectionConverter {
  List toList(Collection c) {...}
}
ログイン後にコピー

サブクラスがこのクラスを拡張し、ジェネリックなしで toList メソッドをオーバーライドする場合:

class Overrider extends CollectionConverter {
  List toList(Collection c) {...}
}
ログイン後にコピー

ジェネリックの導入後、ジェネリック型を使用して toList メソッドを更新すると、生のメソッドが効果的にオーバーライドされます。

class CollectionConverter {
  <T> List<T> toList(Collection<T> c) {...}
}
ログイン後にコピー

サブクラスがその場合未処理の toList メソッドと汎用の toList メソッドの両方を含めるように編集しました:

class Overrider extends CollectionConverter {
  @Override
  List toList(Collection c) {...}
  @Override
  <T> List<T> toList(Collection<T> c) {...}
}
ログイン後にコピー

どちらのメソッドも技術的には汎用の toList メソッドをオーバーライドするため、コンパイラが解決できないあいまいさが生じます。

この混乱を避けるために、 Java では、クラスが同じ消去を持つ複数のメソッドを持つことを許可していないため、プログラマーは設計を慎重に検討し、必要に応じてジェネリック型を使用する必要があります。

以上がJava はメソッドの消去によって引き起こされるオーバーロードの競合をどのように防ぐのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート