Я использую Scala и CouchDB и создал общий метод save
для хранения моих объектов в базе данных. Поскольку он является общим, он не может скомпилировать код.Не удалось получить тип
Мой общий save
метод выглядит следующим образом:
abstract class AbstractRepository[T] extends LazyLogging {
private val config = ConfigFactory.load()
private val hostname: String = config.getString("couchdb.hostname")
private val port: Int = config.getInt("couchdb.port")
val couch = CouchDb(hostname, port)
val mapping: TypeMapping
val db: CouchDbApi
def save(item: T): Unit = {
db.docs.create(item)
}
}
AbstractRepository
получает продлен SummonerRepository
:
class SummonerRepository extends AbstractRepository[Summoner] {
val mapping = TypeMapping(classOf[Summoner] -> "Summoner")
val db = couch.db("summoner-db", mapping)
}
Когда я пытаюсь скомпилировать это я получаю эту ошибку:
Error:(24, 34) Couldn't derive type T db.docs.create(item)
I не понимаю, почему это невозможно получить , Почему это и есть способ обойти эту ошибку?
Edit: Когда я бросаю тип к Summoner
он работает безупречно, но в этом нет никакого смысла, поскольку она не будет родовой больше:
def save(item: T): Unit = {
db.docs.create(item.asInstanceOf[Summoner])
}
С простой точки зрения Scala все в порядке (то есть имеет метод с общим параметром, определяемым как параметр абстрактного типа класса и создающий его с конкретным значением типа). Сообщение об ошибке выглядит мне незнакомым, хотя я искал его и ничего не нашел; просто пара нерелевантных проблем с тем же сообщением, которое имело ошибки из-за конфликтов имен файлов или классов case с> 21 полями. Поэтому я думаю, что это может быть CouchDB. Какой параметр имеет значение 'db.docs.create'? Разумеется, он не может взять какой-то общий тип 'T', определенный во внешней области. – slouc
Работает ли 'db.docs.create [T] (item)'? – ipoteka
@ipoteka Это не сработало – RemcoW