2 回答

TA貢獻(xiàn)1878條經(jīng)驗(yàn) 獲得超4個(gè)贊
當(dāng)查看一個(gè)類型是否實(shí)現(xiàn)了一個(gè)接口時(shí),go 不會(huì)嘗試對該函數(shù)簽名的元素進(jìn)行“接口映射”,它只會(huì)比較確切的簽名。
如果你想讓你的List[T]類型實(shí)現(xiàn)你的Functor[T]接口,你應(yīng)該改變Map()方法的簽名:
func (l List[T]) Map(f Function[T]) Functor[T] {
...
}
額外提一點(diǎn):這與泛型無關(guān),而是與如何在接口上實(shí)現(xiàn)類型檢查有關(guān)。
這是另一個(gè)例子(沒有泛型):
type MyStr string
// MyStr implements fmt.Stringer
func (s MyStr) String() string {
return string(s)
}
// but this method does not fulfill the Concatter interface below
func (s MyStr) Concat(x string) MyStr {
return s + " " + MyStr(x)
}
type Concatter interface {
Concat(s string) fmt.Stringer
}
var _ Concatter = MyStr("") // compilation error
https://go.dev/play/p/tKDGEXlYHyl

TA貢獻(xiàn)1859條經(jīng)驗(yàn) 獲得超6個(gè)贊
函數(shù)簽名中的類型必須完全匹配。所以你只需要改變List.Map
方法的返回類型來返回一個(gè)Functor[T]
.
func (l List[T]) Map(f Function[T]) Functor[T]
現(xiàn)在可以編譯了,因?yàn)?code>List[T]確實(shí)用它自己的方法實(shí)現(xiàn)了 ,并且實(shí)例化 和共享相同的具體類型。Functor[T]
Map
demo
List
固定游樂場:https ://go.dev/play/p/a4GeqXstjct
我的List[int]不也是Functor[int]嗎,因?yàn)長ist[T]滿足Functor[T]?
是的,但是 Go generics不支持任何形式的 type variance,因此List[T]
在您的示例中返回方法簽名不同于接口的方法簽名。
- 2 回答
- 0 關(guān)注
- 148 瀏覽
添加回答
舉報(bào)