我正在尝试为我正在编写的一个简单数据库的值编写一个包装器。目前,我有一个 Value 类,它的类型是ordered 的子类型(这很重要,因为我将对这些值进行比较)。我有 Int、Double、String、Boolean 和 Date 类型的隐式包装器。我的问题是,当我尝试将 Any 类型的内容包装在 Value 中时,我收到一个错误。
这是我的价值课程:
case class Value[A <% Ordered[A]](value: A) extends Ordered[Value[A]] {
def matches(otherType: A): Boolean = {
if(value.getClass == otherType.getClass)
true
else false
}
override def toString() = {
value.toString
}
def compare(other: Value[A]) = value compare other.value
}
object Value {
implicit def intVal(some: Int) = new Value[Int](some) {
def compare(other: Int): Int = value compare other
}
implicit def doubleVal(some: Double) = new Value[Double](some) {
def compare(other: Double): Int = value compare other
}
implicit def stringVal(some: String) = new Value[String](some) {
def compare(other: String): Int = value compare other
}
implicit def boolVal(some: Boolean) = new Value[Boolean](some) {
def compare(other: Boolean): Int = value compare other
}
implicit def dateVal(some: Date) = new Value[Date](some) {
def compare(other: Date): Int = value.compareTo(other)
override def toString() = {
var formatter = new SimpleDateFormat("dd/MM/yyyy")
formatter.format(value)
}
}
// implicit def anyVal(some: Any) = new Value[Any](some){
// def compare(other: Any) = {
//
// }
// }
var x = new Value(0)
}
从另一个类中,我有一个 List[Any] ,我想将其包装为一个值(我知道 Any 是正确的类型之一)。不幸的是,我无法将 Any 包装在一个值中,因为它不是 Ordred 类型。
此外,如果我可以使用泛型 Value 作为类型参数,我的问题将得到解决,但我遇到了问题:
我知道将值放入参数中会更有意义,但是当我将值解析到程序中时,我无法解析类型
例如我想做:
def integer: Parser[Value] = """\d+""".r ^^ {x => Value(augmentString(x).toInt)}
但是,它抱怨 Parser[Value] 需要一个类型。这不是问题,因为我可以创建类型 [Value[Int]] 但是,当我有这样的组合器方法时:
def value: Parser[Value[Something]] = integer ||| real | date
或者
def getSome(some: Value[Something])
我没有包含所有五种可能类型的通用值。
我正在尝试的事情有更好的解决方案吗?