ホームページ > ウェブフロントエンド > jsチュートリアル > ジェネリックスによるあいまいさエラー

ジェネリックスによるあいまいさエラー

Barbara Streisand
リリース: 2024-12-31 06:20:10
オリジナル
632 人が閲覧しました

Erros de Ambiguidade com Genéricos

1.あいまいさエラーとは何ですか?

  • 消去により、明らかに異なる 2 つの汎用宣言が同一の型に変換され、コンパイルの競合が発生する場合に発生します。
  • これらは、メソッドのオーバーロードが関係するシナリオで特に一般的です。

2.あいまいさの例: 消去オーバーロード

問題のあるコード:

class MyGenClass<T, V> {
    T ob1;
    V ob2;

    // Tentativa de sobrecarga
    void set(T o) {
        ob1 = o;
    }

    void set(V o) {
        ob2 = o;
    }
}

ログイン後にコピー

エラー: ジェネリック パラメーター T および V に基づいて set() メソッドをオーバーロードしようとする試みは有効であるように見えますが、あいまいさが生じます。

3.曖昧さの理由

  • 最初の問題: T と V は同じ型である可能性があります。

例:

MyGenClass<String, String> obj = new MyGenClass<>();

ログイン後にコピー

ここでは、T と V の両方が String に置き換えられ、set() の 2 つのバージョンが同一になります。

結果:

  • コンパイラは 2 つのメソッドを区別できません。

2 番目の問題: 消去により型がオブジェクトに削減されます。

  • コンパイル中に、両方のメソッドは次のように変換されます。
void set(Object o) {
    // ...
}

ログイン後にコピー

これにより、T と V の区別がなくなり、オーバーロードが不可能になります

4.なぜこのようなことが起こるのでしょうか?

  • 消去はジェネリック型情報を削除し、その境界型 (境界が指定されていない場合はオブジェクト) に置き換えます。
  • set(T) と set(V) の場合、コンパイラによって生成されたコードでは、どちらも最終的に set(Object) として扱われます。

5.解決策: 汎用オーバーロードを回避します
曖昧さを解決するには、メソッドに別の名前を使用します

修正後の例:

class MyGenClass<T, V> {
    T ob1;
    V ob2;

    void setOb1(T o) {
        ob1 = o;
    }

    void setOb2(V o) {
        ob2 = o;
    }
}

ログイン後にコピー

ここでは、setOb1() と setOb2() は別個のメソッドであるため、競合が解消されます。

6.結論
このようなあいまいさは、消去によってジェネリック パラメーターが単純な型 (オブジェクト) に変換されるために発生します。
間違いを避けるために、次の方法に従ってください:

  • 汎用パラメーターを使用したメソッドのオーバーロードは避けてください。
  • 異なるジェネリック型を操作するメソッドには異なる名前を付けます。 消去動作を理解することは、これらの問題を防止し、ジェネリック クラスを安全に設計するのに役立ちます。

以上がジェネリックスによるあいまいさエラーの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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