Scala隐含任何包装器

时间:2012-12-03 21:14:41

标签: scala types implicit-conversion implicit

我正在尝试为我正在编写的简单数据库编写值的包装器。目前,我有一个类值,它采用一个有序子类型的类型(这很重要,因为我会对值进行比较)。我有类型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])

我没有包含所有五种可能类型的通用值。

我正在尝试的是否有更好的解决方案?

2 个答案:

答案 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)}