1 回答
TA貢獻(xiàn)1790條經(jīng)驗(yàn) 獲得超9個(gè)贊
實(shí)例化失敗,因?yàn)?code>S ~[]E有一個(gè)近似約束,并且沒有足夠的類型信息來實(shí)例化S。
當(dāng)您分配函數(shù)值時(shí):
b := GAddAll[int]
該函數(shù)已經(jīng)被實(shí)例化。引用規(guī)范:
一個(gè)不被調(diào)用的泛型函數(shù)需要一個(gè)類型參數(shù)列表來實(shí)例化;如果列表是部分的,則所有剩余的類型參數(shù)必須是可推斷的。
然而S不可推論。編譯器唯一可用的信息是類型參數(shù)E。在第一遍替換之后,編譯器只能推斷出約束~[]E,現(xiàn)在是~[]int,但類型參數(shù)S仍然未知。
鑒于帶有波浪號(hào) ( ~) 的近似類型集實(shí)際上是無限的,因此無法最終確定什么S是——它可能是type FooSlice []int——并且實(shí)例化失敗。
因此,如果您需要傳遞函數(shù)值,則必須通過提供兩種類型參數(shù)來實(shí)例化:
b := GAddAll[int, []int] // ok
fmt.Printf("%v", b(3, []int{1, 2}))而是使用調(diào)用表達(dá)式:
GAddAll[int](3, []int{1, 2})編譯器仍然不能S從類型參數(shù)中推斷出來int,但它可以從非類型參數(shù)中推斷出來[]int{1,2},然后實(shí)例化函數(shù)。
被調(diào)用的泛型函數(shù)可以提供(可能是部分)類型參數(shù)列表,或者如果省略的類型參數(shù)可以從普通(非類型)函數(shù)參數(shù)中推斷出來,則可以完全省略它。
作為澄清,如果您要從 中刪除波浪號(hào)S ~[]E,如下所示:
func GAddAll[E int, S []E](e E, s S) S {}僅提供 即可成功推理E,因?yàn)?的約束類型集的S基數(shù)為 1(精確類型)。
- 1 回答
- 0 關(guān)注
- 125 瀏覽
添加回答
舉報(bào)
