Mengapa Kejadian Generik Jenis Yang Sama Tidak Boleh Ditugaskan kepada Satu Sama Lain?
Go melarang memberikan contoh jenis generik dengan jenis yang berbeza argumen antara satu sama lain, walaupun jenis argumen memenuhi hubungan antara muka. Untuk menggambarkan ini, pertimbangkan kod berikut:
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 }
Melaksanakan kod ini mengakibatkan ralat penyusunan:
cannot use ExampleProps (variable of type Props[Example]) as Props[Generic] value in return statement
Ralat ini timbul kerana membuat instantiation jenis generik dengan argumen jenis baharu menghasilkan jenis yang berbeza. Khususnya:
Dua jenis ini bukan boleh ditukar ganti, walaupun pada hakikatnya Contoh melaksanakan Generik. Oleh itu, memberikan ContohProps (contoh Props[Contoh]) kepada Props[Generik] adalah tidak sah.
Tingkah laku ini meliputi generik yang digunakan dengan mana-mana. mana-mana hanyalah jenis statik alias antara muka kosong: antara muka{}. Ia tidak bersamaan dengan "mana-mana jenis" atau T. Oleh itu, jenis yang diwujudkan dengan mana-mana tidak boleh diserahkan kepada jenis yang digunakan dengan jenis tertentu yang lain.
Untuk menyelesaikan isu ini, anda boleh membuat seketika Props dengan parameter jenis , memastikan bahawa kedua-dua jenis input dan output fungsi adalah konsisten. Contohnya:
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) }
Atas ialah kandungan terperinci Mengapa Jenis Generik Go dengan Jenis Berbeza Argumen Tidak Boleh Ditugaskan kepada Satu Sama Lain?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!