2 回答

TA貢獻1878條經驗 獲得超4個贊
當查看一個類型是否實現了一個接口時,go 不會嘗試對該函數簽名的元素進行“接口映射”,它只會比較確切的簽名。
如果你想讓你的List[T]類型實現你的Functor[T]接口,你應該改變Map()方法的簽名:
func (l List[T]) Map(f Function[T]) Functor[T] {
...
}
額外提一點:這與泛型無關,而是與如何在接口上實現類型檢查有關。
這是另一個例子(沒有泛型):
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貢獻1859條經驗 獲得超6個贊
函數簽名中的類型必須完全匹配。所以你只需要改變List.Map
方法的返回類型來返回一個Functor[T]
.
func (l List[T]) Map(f Function[T]) Functor[T]
現在可以編譯了,因為List[T]
確實用它自己的方法實現了 ,并且實例化 和共享相同的具體類型。Functor[T]
Map
demo
List
固定游樂場:https ://go.dev/play/p/a4GeqXstjct
我的List[int]不也是Functor[int]嗎,因為List[T]滿足Functor[T]?
是的,但是 Go generics不支持任何形式的 type variance,因此List[T]
在您的示例中返回方法簽名不同于接口的方法簽名。
- 2 回答
- 0 關注
- 139 瀏覽
添加回答
舉報