関数コンストラクターのジェネリックパラメーターの型を推論できません

PHPz
リリース: 2024-02-09 08:00:32
転載
543 人が閲覧しました

関数コンストラクターのジェネリックパラメーターの型を推論できません

php エディターの Youzi が、コンストラクターのジェネリック パラメーターから型を推測できない理由という、誰にとってもよくある質問に答えます。 PHP では、ジェネリック パラメーターの型推論はパラメーターのデフォルト値によって実現されます。ただし、コンストラクターでは、オブジェクトが作成される前にパラメーターが渡されるため、オブジェクトのインスタンスからパラメーターの型を推測することはできません。その結果、コンストラクターでジェネリック パラメーターの型を推論できなくなり、この問題を解決するには型を手動で指定する必要があります。

質問の内容

Go にはジェネリック コードがあり、ジェネリック パラメーターを持つ「マスター」型と、同じジェネリック パラメーターを共有する必要がある多くの「スレーブ」型があります。コードは次のようになります:

リーリー

基本的に、ユーザーはatを定義し、その後bでのtを同じにする必要があります。このタイプのコードはジェネリックスをサポートする他の言語でも動作しますが、go ではコメント行でcannot infer tコンパイル エラーが発生します (go プレイグラウンド コードはこちらを参照してください)。aの型パラメータがintに設定されているように見えるため、bの型パラメータもintに設定する必要があります。代わりにnewb[int]()を呼び出すこともできますが、それは冗長すぎるように思えます。なぜこのようなことが起こるのでしょうか?

解決策

これは、「コンパイラは戻り値の型の使用方法に基づいて型パラメータを推論できないのはなぜですか?」のバリエーションです。回答: go 1.20 では、これは型推論の仕組みではないためです。

型推論適用対象:

  • 型パラメータリスト
  • 既知の型パラメーター (存在する場合) で初期化された置換マップ m
  • 通常の関数パラメータの (空の可能性がある) リスト (関数呼び出しの場合のみ)

これらのルールを 1 つずつ確認すると:

  • newb()型パラメータのリストはありますか?いいえ。呼び出し時に型パラメータを指定しませんでした。

  • 他の型パラメーターを推論するために使用できる他の既知の型パラメーターはありますか?いいえ、型パラメータをまったく指定していません。このケースは、型パラメータの一部を指定する関数呼び出しに適用されることに注意してください。例:

    リーリー

    上記では、t(例:float64) のみを指定でき、コンパイラはt -> float64を使用して置換マップを構築し、推論します。u -> *float64

  • 最後に、通常の関数パラメータのリストはありますか?いいえ。newbは空です。

###それだけです。コンパイラは、関数の戻り値の型がどのように使用されるかに基づいて型パラメータを推論しません。

この記事の執筆時点で、議論されている関連提案は次のとおりです:

以上が関数コンストラクターのジェネリックパラメーターの型を推論できませんの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:stackoverflow.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!