在我正在处理的代码中,我有一个名为SuccessMessage的类,其中包含actorType(枚举)和payload两个字段。我不确定应该将payload设置为什么类型。
如果我将payload设置为Any类型,那么在稍后的代码中,我需要进行很多恶心的instanceOf类型转换才能处理它,以便更具体的实现。
如果我使用泛型,并将payload设置为T类型,我的其他类也必须包含类型T。例如,在我的高级Trait中,称为Commander,我有一个名为handleSuccess的方法,它接收一个SuccessMessage,并且它还必须能够接收T类型的成功消息,从而强制要求我的commander也是T类型。
我不确定是否必须在这两个较小的恶之间做出选择,或者是否有更好的方法。我必须包含某种通用payload的方式,因为SuccessMessage需要不同类型的payload。
编辑: 泛型还存在另一个问题。Commander必须能够处理许多不同类型的SuccessMessages,因此,如果在handleSuccess中使用了SuccessMessage[T],则会强制将Commander设置为Commander[T],那么Commander就无法处理具有不同类型的成功消息(我认为,不是100%确定)。
编辑2: 这是Commander的简短代码:
EDIT 3: 这里提供了一个工作流程来更好地解释问题。
- Commander发送信息到Poller - Poller向Commander发送SuccessMessage(self, List[String])
- Commander将List[String]发送给Processor - Processor向Commander发送SuccessMessage(self, File)
- Commander将File发送给Uploader - Uploader向Commander发送SuccessMessage(self, Boolean)
- 以此类推
因此,我们需要让SuccessMessage接受不同的类型。
如果我将payload设置为Any类型,那么在稍后的代码中,我需要进行很多恶心的instanceOf类型转换才能处理它,以便更具体的实现。
如果我使用泛型,并将payload设置为T类型,我的其他类也必须包含类型T。例如,在我的高级Trait中,称为Commander,我有一个名为handleSuccess的方法,它接收一个SuccessMessage,并且它还必须能够接收T类型的成功消息,从而强制要求我的commander也是T类型。
我不确定是否必须在这两个较小的恶之间做出选择,或者是否有更好的方法。我必须包含某种通用payload的方式,因为SuccessMessage需要不同类型的payload。
编辑: 泛型还存在另一个问题。Commander必须能够处理许多不同类型的SuccessMessages,因此,如果在handleSuccess中使用了SuccessMessage[T],则会强制将Commander设置为Commander[T],那么Commander就无法处理具有不同类型的成功消息(我认为,不是100%确定)。
编辑2: 这是Commander的简短代码:
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])
EDIT 3: 这里提供了一个工作流程来更好地解释问题。
- Commander发送信息到Poller - Poller向Commander发送SuccessMessage(self, List[String])
- Commander将List[String]发送给Processor - Processor向Commander发送SuccessMessage(self, File)
- Commander将File发送给Uploader - Uploader向Commander发送SuccessMessage(self, Boolean)
- 以此类推
因此,我们需要让SuccessMessage接受不同的类型。
handleSuccess
具体来说会如何处理成功消息的有效载荷值? - Dan GetzSuccessMessage
的子类,还是只是使用它的类? - sepp2k