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 サイトの他の関連記事を参照してください。