関数コンストラクターのジェネリックパラメーターの型を推論できません
php エディターの Youzi が、コンストラクターのジェネリック パラメーターから型を推測できない理由という、誰にとってもよくある質問に答えます。 PHP では、ジェネリック パラメーターの型推論はパラメーターのデフォルト値によって実現されます。ただし、コンストラクターでは、オブジェクトが作成される前にパラメーターが渡されるため、オブジェクトのインスタンスからパラメーターの型を推測することはできません。その結果、コンストラクターでジェネリック パラメーターの型を推論できなくなり、この問題を解決するには型を手動で指定する必要があります。
質問の内容
Go にはジェネリック コードがあり、ジェネリック パラメーターを持つ「マスター」型と、同じジェネリック パラメーターを共有する必要がある多くの「スレーブ」型があります。コードは次のようになります:
リーリー基本的に、ユーザーは a
で t
を定義し、その後 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 サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











Sublime Text で Python コードを実行するためのショートカット キーは次のとおりです。 Windows および Linux: Ctrl + BMac: Cmd + B コード内にカーソルを置きます。ショートカットキーを押します。コードは、システムのデフォルトの Python インタープリタを使用して実行されます。

関数の継承では、「基底クラス ポインター」と「派生クラス ポインター」を使用して継承メカニズムを理解します。基底クラス ポインターが派生クラス オブジェクトを指す場合、上方変換が実行され、基底クラスのメンバーのみにアクセスされます。派生クラス ポインターが基本クラス オブジェクトを指す場合、下向きキャストが実行される (安全ではない) ため、注意して使用する必要があります。

Notepad++ 自体は C 言語プログラムを実行できず、コードをコンパイルして実行するには外部コンパイラが必要です。外部コンパイラを使用するには、次の手順に従ってセットアップします: 1. C 言語コンパイラをダウンロードしてインストールします; 2. Notepad++ でカスタム ツールを作成し、コンパイラの実行可能ファイルのパスとパラメータを構成します; 3. C 言語プログラムを選択し、.c ファイル拡張子を付けて保存します。 4. C 言語プログラム ファイルを選択し、[実行] メニューからコンパイルするカスタム ツールを選択します。 5. コンパイル結果を表示し、コンパイル エラーまたは成功メッセージを出力します。 。コンパイルが成功すると、実行可能ファイルが生成されます。

Java の val キーワードは、不変のローカル変数を宣言するために使用されます。つまり、その値は一度割り当てられると変更できません。特徴は次のとおりです。 不変性: val 変数は、一度初期化されると再割り当てできません。ローカル スコープ: val 変数は、宣言されているコード ブロック内でのみ表示されます。型推論: Java コンパイラーは、割り当てられた式に基づいて val 変数の型を推論します。ローカル変数のみ: val は、クラス フィールドやメソッド パラメーターではなく、ローカル変数を宣言するためにのみ使用できます。

Java プログラミング言語の「=」演算子は、変数に値を代入し、式の右側の値を左側の変数に格納するために使用されます。使用法: 変数 = 式。ここで、変数は割り当てを受け取る変数の名前であり、式は値を計算または返すコード セグメントです。

const 修飾子は定数を示し、値は変更できません。static 修飾子は変数の有効期間とスコープを示します。 const によって変更されたデータ メンバーは、初期化後に変更できません。static によって変更された変数は、プログラムの開始時に初期化され、プログラムの終了時に破棄されます。アクティブなオブジェクトがなくても存在し、関数間でアクセスできます。 const で変更されたローカル変数は宣言時に初期化する必要がありますが、static で変更されたローカル変数は後で初期化できます。 const 修飾されたクラス メンバー変数はコンストラクターまたは初期化リストで初期化する必要がありますが、静的修飾されたクラス メンバー変数はクラスの外部で初期化できます。

Go言語の位置付けに関する議論:上位言語の特徴は何ですか?ソフトウェア開発の分野において、プログラミング言語は設計目標や位置付けに応じていくつかのカテゴリに分類され、そのうちの1つが上位言語と呼ばれます。高レベル言語とは、下位レベルの言語よりも抽象的かつ高レベルのプログラミング言語を指し、通常、より強力な機能とより高い抽象レベルを備え、複雑な機能をより迅速に実装できます。 Go言語は現代のプログラミング言語としては上位言語とも言えますが、どのような特徴があるのでしょうか。次に議論します

Java ジェネリック メソッドで型パラメーターを制限するには、Bound が型またはインターフェイスである構文を使用します。そのため、パラメーターは、Bound から継承するタイプ、または Bound インターフェイスを実装するタイプのみを受け入れます。たとえば、T をそれ自体と同等の型に制限します。
