如何解决"interface method must have no type parameters"?

How to solve "interface method must have no type parameters"?

我正在尝试在 1.18beta2 中使用 go generics,我正在尝试为 key/value 存储 boltdb 编写一个抽象层。这就是我试图用它实现的目标。

type Reader interface {
    Read(bucket []byte, k ...[]byte) ([][]byte, error)
    ReadDoc[V Unmarshaler](bucket []byte, factory func() (V, error), k ...[]byte) ([]V, error)
}

type Unmarshaler interface {
    UnmarshalKV(v []byte) error
}

这样我就可以为它提供一个工厂来在它找到 key/value 时创建类型,将数据解组到其中并 return 返回该特定类型的一部分。只有我从编译器得到“接口方法必须没有类型参数”。为什么接口中不允许类型参数?支持这个计划吗?这粉碎了我的梦想......本来是完美的。但是它确实可以在界面之外工作。

运行 今天早些时候进入同一期。这似乎是 generics/type 参数的设计决定,因为在接口定义(和实现工作)中可能有多种“方式”来解释具有类型参数的方法。

在某些情况下,它可能意味着:

  • 不保留参数的标识。
  • 编译时需要遍历整棵树,影响性能
  • 需要在运行时进行反射,这会影响性能。
  • 参数化方法不实现接口,这会导致混淆。

更多信息在 Type parameters proposal, No parametrized methods

但是您可以将类型参数移动到接口类型定义中。 Proposal, Very high level overview:

type Reader[V Unmarshaler] interface {
    Read(bucket []byte, k ...[]byte) ([][]byte, error)
    ReadDoc(bucket []byte, factory func() (V, error), k ...[]byte) ([]V, error)
}

type Unmarshaler interface {
    UnmarshalKV(v []byte) error
}