ホームページ >バックエンド開発 >Golang >異なる型引数を持つ Go のジェネリック型を相互に代入できないのはなぜですか?

異なる型引数を持つ Go のジェネリック型を相互に代入できないのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-19 11:22:09578ブラウズ

Why Can't Go's Generic Types with Different Type Arguments Be Assigned to Each Other?

同じ型のジェネリック インスタンスを互いに割り当てることができないのはなぜですか?

Go では、ジェネリック型のインスタンスを異なる型で割り当てることを禁止しています型引数がインターフェイス関係を満たしている場合でも、引数を相互に共有できます。これを説明するには、次のコードを考えてみましょう:

type Generic interface {
    ID() string
}

type Props[G Generic] struct{}

type Example struct {
    id string
}

func (example Example) ID() string {
    return example.id
}

var ExampleProps = Props[Example]{}

func Problem() Props[Generic] {
    return ExampleProps
}

このコードを実行するとコンパイル エラーが発生します:

cannot use ExampleProps (variable of type Props[Example]) as Props[Generic] value in return statement

このエラーは、新しい型引数を使用してジェネリック型をインスタンス化すると、独特のタイプ。具体的には:

  • Props[Example] は 1 つの名前付き型であり、
  • Props[Generic] は別の名前付き型です。

これら 2 つの型は異なります。 Example は Generic を実装しているにもかかわらず、互換性があります。したがって、ExampleProps (Props[Example] のインスタンス) を Props[Generic] に割り当てることは無効です。

この動作は、any でインスタンス化されたジェネリックにも適用されます。 any は、空のインターフェイス (interface{}) のエイリアスを作成する単なる静的型です。これは、「any type」または T と同等ではありません。したがって、any でインスタンス化された型は、別の特定の型でインスタンス化された型に割り当てることはできません。

この問題を解決するには、型パラメータを使用して Props をインスタンス化できます。これにより、関数の入力型と出力型の両方が一貫していることが保証されます。例:

type Props[G Generic] struct{ Value G }

func Problem[T Generic](v T) Props[T] {
    return Props[T]{ Value: v }
}

func main() {
    a := Problem(Example{})
    fmt.Println(a)
}

以上が異なる型引数を持つ Go のジェネリック型を相互に代入できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。