我正在尝试创建一个只能更新一次的类型。在请求对象有值,如果访问它将抛出异常。之后用户可以更新对象,但其他更新将被忽略。 这是为了有一种状态对象更新其状态一次,在流程中,忽略更新方法的实际imp,但我得到变量,逆变的编译错误... 有没有办法解决它?
case class EmptyValueException(message: String = "empty value") extends RuntimeException(message)
trait SingleUpdate[+T] {
def get: T
}
case object EmptyValue extends SingleUpdate[Nothing] {
def get: Nothing = throw EmptyValueException()
}
case class HasValue[+T](value: T) extends SingleUpdate[T] {
def get: T = value
}
object SingleUpdater {
def apply[T]() = new SingleUpdater[T]()
}
class SingleUpdater[+T] {
var single: SingleUpdate[T] = EmptyValue
def get = single.get
def update[T](value: T) = single = HasValue[T](value)
}
答案 0 :(得分:1)
这里有一个快速编译的意图实现,尽管它在类型MyLogger(musicdl=myapp)
中是不变的。此外,它忽略了第一个之后的更新,这是我理解你的意图。它会默默地执行此操作,您可能希望更改它(例如,如果尝试再次更新则抛出异常)。
T
使用示例:
case class EmptyValueException(message: String = "empty value") extends RuntimeException(message)
trait SingleUpdate[T] {
def get: T = throw EmptyValueException()
def isSet = false
}
case class HasValue[T](value: T) extends SingleUpdate[T] {
override def get: T = value
override def isSet = true
}
object SingleUpdater {
def apply[T]() = new SingleUpdater[T]()
}
class SingleUpdater[T] {
var single: SingleUpdate[T] = new SingleUpdate[T] {}
def get = single.get
def update(value: T) = if (!single.isSet) single = HasValue[T](value)
}