- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我正在处理的代码中,我有一个名为 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:这里是工作流程的描述,以更好地解释问题。
因此,我们需要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/
我是一名优秀的程序员,十分优秀!