PHP プログラミングでは、型アサーションは変数の型を決定するために使用される一般的な手法です。ただし、場合によっては、型パラメーター値に型アサーションを使用できないという問題が発生することがあります。この質問は一部の開発者を混乱させる可能性があります。この記事では、この問題の原因を調査し、いくつかの解決策を提供します。初心者でも経験豊富な開発者でも、この問題を理解して解決することで、型アサーションをよりよく理解し、使用できるようになります。見てみましょう!
ジェネリック型変数には型アサーションを使用できません。これは、interface{}
で許可されているが、interface{}
によって制限されない一般的な動作であることを考えると、奇妙に思えます。何か回避策はないでしょうか?
// This works func isInt(x interface{}) bool { _, ok := x.(int) return ok; } // Compile Error // invalid operation: cannot use type assertion on type parameter // value x (variable of type T constrained by interface{}) func isInt2[T interface{}](x T) bool { _, ok := x.(int) return ok; }
型アサーションはインターフェイス値に対してのみ実行できます。したがって、まず #xx を有効なインターフェイス タイプに変換する必要があります。この場合は
any /
interface{}:
リーリー
t
の型は型パラメータであり、インターフェイスではありません。それはインターフェースによってのみ制限されます。 go (リビジョン 1.18
) 言語仕様では、type パラメータ
を type アサーション : に使用することは許可されていないと明確に述べています。
インターフェース型の式の場合 (型 x ではない)
パラメータ と型 t...シンボル
x.(t)
は型アサーションと呼ばれます。
からも、コンパイル時にパラメーターの型を解決する必要がある理由を学習してください: 型パラメータの制約は通常、次のセットを表しますが、 型。コンパイル時に型パラメーターは
単一の型を表します。 呼び出しコードによって型パラメータとして指定される型。タイプの場合 パラメータの型は型パラメータ制約によって許可されていません。 コードをコンパイルできません。
以上が型パラメータ値に型アサーションを使用できませんの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。