私が作成している単純なデータベースの値のラッパーを作成しようとしています。現在、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 つの型すべてを網羅するジェネリックな値はありません。
私がしようとしていることに対するより良い解決策はありますか?