鑒于這些型別定義:
type N interface{ ~int | ~float32 | ~float64 }
type S[T any] struct {
t T
}
type myInt int
type pSpMyInt[T myInt] *S[*T]
type spMyInt[T *myInt,] S[T]
type spMyInt2[T myInt] S[*T]
我可以創建一個type pSpMyIntvar
func createPS[T myInt]() pSpMyInt[T] {
var i T
s := S[*T]{t: &i}
return &s
}
但我無法弄清楚如何創建spMyIntor的變數spMyInt2。
這個
func createSP[T myInt]() spMyInt2[T] {
var i T
s := S[*T]{t: &i}
return s
}
編譯失敗
cannot use s (variable of type S[*T]) as type spMyInt2[T] in return statement。
uj5u.com熱心網友回復:
首先,不要使用精確型別引數約束。它幾乎沒有意義。當您將函式宣告為時,型別引數型別集的基數為 1,因此它只能有效地由createPS[T myInt]()實體化。您可以像下面這樣重寫函式:myInt
func createPS() pSpMyInt[myInt] {
var i myInt
s := S[*myInt]{t: &i}
return &s
}
有了這個:
型別S[*T] 與spMyInt2[T]. _ 但是,由于spMyInt2[T]的基礎型別是S[*T],您可以簡單地轉換:
func createSP2[T myInt]() spMyInt2[T] {
var i T
s := S[*T]{t: &i}
return spMyInt2[T](s) // conversion
}
至于type spMyInt[T *myInt,] S[T](逗號不是拼寫錯誤,而是避免決議歧義所必需的),事情并沒有那么簡單。
問題是型別引數不是它的型別約束。因此型別文字不能用于實體化不同的未命名型別文字。要明確:
// naive attempt that doesn't compile
func createSP1[T myInt]() spMyInt[*T] {
var i T
s := S[*T]{t: &i}
return spMyInt[*T](s)
}
你可能認為spMyInt[T *myInt]有一個型別引數被約束到*myInt并且函式T被基型別約束myInt,因此 *T應該滿足T *myInt。這是不正確的,因為型別文字*T不等同于*myInt. 所以實際上你不能為type spMyInt[T *myInt,] S[T].
但是你很幸運,因為型別約束的基數為 1。所以你可以洗掉型別引數:
func createSP1() spMyInt[*myInt] {
var i myInt
s := S[*myInt]{t: &i}
return spMyInt[*myInt](s)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/537062.html
標籤:去仿制药
