У меня есть этот класс типов:
sealed trait DbValueOps[T <: DbValue] {
type R
def apply(newContent: R): Option[T]
def fromString(newContent: String): Option[T]
def isValidContent(newContent: R): Boolean
}
с экземпляром класса этого типа:
package object DbOps {
implicit val dbStringOps: DbValueOps[DbString] = new DbValueOps[DbString] {
type R = String
def apply(newContent: String): Option[DbString] =
isValidContent(newContent) match {
case true => Some(new DbString(newContent))
case false => None
}
def fromString(newContent: String): Option[DbString] = this(newContent)
def isValidContent(newContent: String): Boolean = !newContent.isEmpty
}
}
Но при попытке использовать экземпляр класса типа с чем-то вроде dbStringOps.isValidContent(newContent)
, где newcontentэто строка, я получаю несоответствие типов:
found : newContent.type (with underlying type String)
required: database.DbOps.dbStringOps.R
Я могу заставить ее работать, преобразовав R из члена абстрактного типа в параметр типа, но это ужасно, так как R уже определено, когда я 'Я пишу реализацию класса типа.