1 回答

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