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 关注
- 105 浏览
添加回答
举报