我正在尝试为我正在编写的简单数据库编写值的包装器。目前,我有一个类值,它采用一个有序子类型的类型(这很重要,因为我会对值进行比较)。我有类型Int,Double,String,Boolean和Date的隐式包装器。我的问题是,当我尝试在值中包装Any类型时,我收到错误。
这是我的价值类:
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类型。
另外,如果我可以使用通用值作为类型参数但是我遇到了问题,我的问题就解决了:
我知道将值放在参数中更有意义但是当我将值解析到我的程序中时,我无法解析Type
例如,我想这样做:
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])
我没有包含所有五种可能类型的通用值。
我正在尝试的是否有更好的解决方案?
答案 0 :(得分:0)
要使def value: Parser[Value[Something]] = integer ||| real | date
工作,你真的需要像......
trait Value
case class StringValue(s: String) extends Value
case class IntValue(i: Int) extends Value
case class DateValue(d: Date) extends Value
答案 1 :(得分:0)
也许你可以使用scala中编码不相交联合类型的方法之一(参见:Does Scala have “type disjunction” (union types)?)
例如,如果您使用"stuttering or"方法,则可以定义:
case class Value[A <% Ordered[A] <% String or Int or Double or Boolean](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
}
然后你可以:
def integer[T <% Value[T]] = """\d+""".r ^^ {x => Value(augmentString(x).toInt)}