0

私が作成している単純なデータベースの値のラッパーを作成しようとしています。現在、ordered のサブタイプである型を取る Value クラスがあります (値の比較を行うため、これは重要です)。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が正しいタイプの1つであることはわかっています)。残念ながら、Any は Ordred 型ではないため、Any を値でラップする方法がありません。

また、ジェネリック値を型パラメーターとして使用できれば問題は解決しますが、問題があります。

パラメーターに値を入れるだけの方が理にかなっていることはわかっていますが、値を解析してプログラムに入れると、タイプを解決する方法がありません

たとえば、私はやりたい:

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])

考えられる 5 つの型すべてを網羅するジェネリックな値はありません。

私がしようとしていることに対するより良い解決策はありますか?

4

2 に答える 2

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
于 2012-12-04T01:13:02.907 に答える
0

scala で互いに素な共用体型をエンコードする方法の 1 つを使用できるかもしれません (「Does Scala has "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)}
于 2012-12-04T21:52:24.857 に答える