gpt4 book ai didi

Scala 泛型与任何泛型

转载 作者:行者123 更新时间:2023-12-01 09:21:19 25 4
gpt4 key购买 nike

在我正在处理的代码中,我有一个名为 SuccessMessage 的类,其中包含字段 actorType(枚举)和有效负载。我不确定要制作什么类型的有效载荷。

如果我制作 Any 类型的负载,我必须做很多看起来很粗暴的 instanceOf 类型转换,以便稍后在我的代码中以更具体的实现来处理它。

如果我使用泛型,并生成 T 类型的负载,我的其他类也必须包含 T 类型。例如,在我的一个名为 Commander 的高级特征中,我有一个名为 handleSuccess 的方法,它接受一个 SuccessMessage ,并且它必须能够接收通用类型 T 的成功消息,强制我的指挥官也是通用类型 T。

我不确定我是否必须在这两个较小的弊端之间做出选择,或者是否有更好的方法。我必须包含一些生成有效载荷的方法,因为成功消息需要不同类型的有效载荷。

编辑:泛型还有一个问题。 Commander 必须能够处理多种不同类型的 SuccessMessage,因此如果它在 handleSuccess 中采用 SuccessMessage[T],强制 Commander 成为 Commander[T],那么 Commander 将无法处理不同类型的成功消息(我想想,不是 100% 肯定)。

编辑 2:这是指挥官的一小段:

trait Commander {
def handleSuccess(message: SuccessMessage){
//based on SuccessMessage.ActorType, do different stuff
}

class SuccessMessage(val actorType: ActorType, val payload: Option[Any])
class SuccessMessage(val actorType: ActorType, val payload: Option[T])

编辑 3:这里是工作流程的描述,以更好地解释问题。

  • Commander 向 Poller 发送消息
    • Poller 发送 SuccessMessage(self, List[String]) 给 Commander
  • Commander 发送 List[String] 给 Processor
    • Processor 发送 SuccessMessage(self, File) 给 Commander
  • 指挥官将文件发送给上传者
    • Uploader发送SuccessMessage(self, Boolean)给Commander
  • 等等。

因此,我们需要SuccessMessage取不同的类型。

最佳答案

除非 T 有一些类型边界允许编译器假设其行为的某些事情,否则您必须将 T 的实例转换为某种具体类型才能将它们用于任何明确的目的。 (与 Any 基本相同的问题)

你可能想看看类型类。然后您可以为每种类型定义某种处理程序,并使用隐式类型类实例将传入的有效负载与处理程序匹配。 (参见 https://github.com/mpilquist/simulacrum 库)

编辑:此处示例 -> https://gist.github.com/phaistos/51f0405a2f25812a5780基本上你最终得到一个像这样的类型类:

@typeclass trait CommanderHandler[A] {
def handle(payload: A): Unit
}

然后为每个要用作有效负载的类型创建一个实例:

implicit val handlerInt: CommanderHandler[Int] = new CommanderHandler[Int] {
def handle(payload: Int) { /* use the payload here */ }
}

然后你可以创建一个这样的函数来处理它们:

def consumePayload[T](t: T)(implicit h: CommanderHandler[T]) {
h.handle(t)
}

您为给定类型创建的隐式必须在 consumePayload 的调用站点可用。基本上,您只是将每种类型的处理程序包装在一个漂亮的小包中。

这是迄今为止我为此类事情找到的最简洁的模式。希望能帮助到你。如果您使用 simulacrum,请务必阅读文档,您将需要在创建类型类后进行一些导入以使其工作。

编辑:作为替代方案,您还可以通过 shapeless 查看多态方法:https://github.com/milessabin/shapeless/wiki/Feature-overview:-shapeless-2.0.0#polymorphic-function-values

关于Scala 泛型与任何泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31731752/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com