Scala 如何使用多个约束约束类型变量?
我有以下几种:Scala 如何使用多个约束约束类型变量?,scala,Scala,我有以下几种: object Messenger { sealed trait MessageOrigin case object SAP extends MessageOrigin case object KAFKA extends MessageOrigin final case class Message(topic: String, event: String, data: String, origin: Me
object Messenger {
sealed trait MessageOrigin
case object SAP extends MessageOrigin
case object KAFKA extends MessageOrigin
final case class Message(topic: String, event: String,
data: String, origin: MessageOrigin,
proceed: Long = java.time.Instant.now().toEpochMilli)
sealed trait MessageCmd
case class SaveMessage(value: Message) extends MessageCmd
sealed trait MessageEvent
case class MessageSaved(value: Message) extends MessageEvent
final case class MessageState(value: Message = Message("", "", "", SAP))
}
object Logger {
sealed trait Level
final case object Error extends Level
final case object Warning extends Level
final case object Info extends Level
final case class Log(level: Level, msg: String)
sealed trait LogCmd
final case class SaveLog(value: Log) extends LogCmd
sealed trait LogEvent
final case class LogSaved(value: Log) extends LogEvent
final case class LogState(value: Log = Log(Info, "Initial"))
}
我想做的是,将以下case类的以下类型变量A
约束为:
final case class TrashTalk[A : LogCmd, MessageCmd](value: A)
但编译器抱怨:
scala> final case class TrashTalk[A : LogCmd, MessageCmd](value: A)
<console>:19: error: LogCmd does not take type parameters
final case class TrashTalk[A : LogCmd, MessageCmd](value: A)
scala>final case类垃圾话[A:LogCmd,MessageCmd](值:A)
:19:错误:LogCmd不接受类型参数
最后一个案例类垃圾话[A:LogCmd,MessageCmd](值:A)
我做错了什么?首先,
LogCmd
和MessageCmd
不是类型类,所以:
语法即使只指定一个类型也不起作用
final case class TrashTalk[A : LogCmd](value: A) // Error
应该是
final case class TrashTalk[A <: LogCmd](value: A)// OK
首先,
LogCmd
和MessageCmd
不是类型类,因此即使只指定一个类型,:
语法也不起作用
final case class TrashTalk[A : LogCmd](value: A) // Error
应该是
final case class TrashTalk[A <: LogCmd](value: A)// OK
您试图将您的类型限制为什么<代码>保存消息?扩展
MessageCmd
?类型A
应为LogCmd
或MessageCmd
。您试图将类型限制为什么<代码>保存消息?扩展MessageCmd
?类型A
应为LogCmd
或MessageCmd
。