php エディターの Youzi が、コンストラクターのジェネリック パラメーターから型を推測できない理由という、誰にとってもよくある質問に答えます。 PHP では、ジェネリック パラメーターの型推論はパラメーターのデフォルト値によって実現されます。ただし、コンストラクターでは、オブジェクトが作成される前にパラメーターが渡されるため、オブジェクトのインスタンスからパラメーターの型を推測することはできません。その結果、コンストラクターでジェネリック パラメーターの型を推論できなくなり、この問題を解決するには型を手動で指定する必要があります。
Go にはジェネリック コードがあり、ジェネリック パラメーターを持つ「マスター」型と、同じジェネリック パラメーターを共有する必要がある多くの「スレーブ」型があります。コードは次のようになります:
リーリー基本的に、ユーザーはa
でt
を定義し、その後b
でのt
を同じにする必要があります。このタイプのコードはジェネリックスをサポートする他の言語でも動作しますが、go ではコメント行でcannot infer t
コンパイル エラーが発生します (go プレイグラウンド コードはこちらを参照してください)。a
の型パラメータがint
に設定されているように見えるため、b
の型パラメータもint
に設定する必要があります。代わりにnewb[int]()
を呼び出すこともできますが、それは冗長すぎるように思えます。なぜこのようなことが起こるのでしょうか?
これは、「コンパイラは戻り値の型の使用方法に基づいて型パラメータを推論できないのはなぜですか?」のバリエーションです。回答: go 1.20 では、これは型推論の仕組みではないためです。
型推論適用対象:
これらのルールを 1 つずつ確認すると:
newb()
型パラメータのリストはありますか?いいえ。呼び出し時に型パラメータを指定しませんでした。
他の型パラメーターを推論するために使用できる他の既知の型パラメーターはありますか?いいえ、型パラメータをまったく指定していません。このケースは、型パラメータの一部を指定する関数呼び出しに適用されることに注意してください。例:
リーリー上記では、t
(例:float64
) のみを指定でき、コンパイラはt -> float64
を使用して置換マップを構築し、推論します。u -> *float64
最後に、通常の関数パラメータのリストはありますか?いいえ。newb
は空です。
以上が関数コンストラクターのジェネリックパラメーターの型を推論できませんの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。