在我正在处理的代码中,有一个名为SuccessMessage的类,它包含字段、actorType (枚举)和有效负载。我不知道该做什么类型的有效载荷。
如果我使任何类型的有效负载,我必须做许多外观大体的instanceOf类型转换,以处理它以后在我的代码在更具体的实现。
如果我使用泛型,并生成T类型的有效负载,我的其他类也必须包括T类型--例如,在我的一个名为handleSuccess的高级特性中,我有一个名为SuccessMessage的方法,它必须能够接受泛型T类型的成功消息,迫使我的指挥官也是泛型T型。
我不知道我是否必须在这两种较小的罪恶之间作出选择,或者是否有更好的办法来做到这一点。我必须包括一些生成有效负载的方法,因为成功消息需要不同类型的有效负载。
编辑:泛型还有一个额外的问题。指挥官必须能够处理许多不同类型的SuccessMessages,所以如果在handleSuccess中使用SuccessMessageT,迫使指挥官成为CommanderT,那么指挥官将无法处理不同类型的成功消息(我认为,不是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:下面是对工作流的描述,以更好地解释问题。
因此,我们需要SuccessMessage采取不同的类型。
发布于 2015-07-30 19:37:39
除非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
的调用站点上可用。基本上,您只是将每个类型的处理程序包装在一个很好的小包中。
到目前为止,这是我为这类事情找到的最整洁的模式。希望能帮上忙。确保您阅读了模拟文档,如果您使用它,您将需要在创建类型集之后进行一些导入才能使其工作。
编辑:作为另一种选择,您还可以通过shapeless:https://github.com/milessabin/shapeless/wiki/Feature-overview:-shapeless-2.0.0#polymorphic-function-values查看多态方法。
https://stackoverflow.com/questions/31731752
复制相似问题