【发布时间】:2023-02-09 05:59:01
【问题描述】:
我正在尝试使用泛型实现接口
Interface
。它有一个方法接受另一个接口作为参数:
type SubInterface interface {
SendResponse(string)
}
type Interface interface {
Subscribe(SubInterface)
}
我想出了这些接口的以下通用版本:
type GenericSubInterface[T any] interface {
SendResponse(T)
}
type GenericInterface[Res any] interface {
Subscribe(GenericSubInterface[Res])
}
我希望
GenericInterface[string]
可以分配给
Interface
但不知何故不是。
var a Interface
var b GenericInterface[string]
// cannot use b (variable of type GenericInterface[string]) as Interface value in assignment: GenericInterface[string] does not implement Interface (wrong type for method Subscribe)
// have Subscribe(GenericSubInterface[string])
// want Subscribe(SubInterface)
a = b
创建
Interface
的通用实现也不起作用:
type GenericImplementation[Res any] struct {
}
func (i *GenericImplementation[Res])Subscribe(ss GenericSubInterface[Res]) {
var msg Res
ss.SendResponse(msg)
}
// cannot use &GenericImplementation[string]{} (value of type *GenericImplementation[string]) as Interface value in variable declaration: *GenericImplementation[string] does not implement Interface (wrong type for method Subscribe)
// have Subscribe(GenericSubInterface[string])
// want Subscribe(SubInterface)
var c Interface = &GenericImplementation[string]{}
我觉得奇怪的是子接口可以相互分配:
var d SubInterface
var e GenericSubInterface[string]
// works fine
d = e
这个问题似乎只在接口以某种方式嵌套时才会出现。有没有办法解决这个问题,我可以使用泛型来实现
string
以外的类型的
Interface
?