Go では、ジェネリック インターフェイスと実装では、異なる型引数間での直接代入は許可されません。
考えてみましょう単純化した例:
// Abstract type Generic interface { ID() string } type Props[G Generic] struct{} // Example type Example struct { id string } func (example Example) ID() string { return example.id } var ExampleProps = Props[Example]{} // Problem func Problem() Props[Generic] { return ExampleProps }
このコードはコンパイル エラーをスローしますreturn ステートメントで Props[Example] を Props[Generic] に割り当てることはできないことを示しています。これは、異なる型引数を使用してジェネリック型をインスタンス化するときに、Go が個別の名前付き型を作成するためです。
次の関数を考えてみましょう:
func Problem() Props[Generic] { return ExampleProps }
型引数として Generic を使用して Props をインスタンス化します。その結果、たとえ Example が Generic を実装していても、Props[Example] と Props[Generic] は 2 つの異なる型になります。したがって、型パラメーターに関係なく、Props[Example] を Props[Generic] に割り当てることは無効です。
この問題を解決するには、1 つのオプションは、Generic 制約を満たす型パラメーターを使用して Props をインスタンス化することです。
// adding a field to make this a bit less contrived type Props[G Generic] struct{ Value G } // Props instantiated with T, adequately constrained func Problem[T Generic](v T) Props[T] { return Props[T]{ Value: v } } func main() { a := Problem(Example{}) fmt.Println(a) }
この例では、Generic インターフェイスに準拠する型パラメーター T を使用して Props がインスタンス化されます。これにより、Props[Example] 型の値を Props[Generic] に割り当てることが可能になり、型の安全性が確保されます。
以上がGo ジェネリック型に異なる引数を割り当てられないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。