2016-12-05 6 views
0

Я использую 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]) 
     } 
+0

С простой точки зрения Scala все в порядке (то есть имеет метод с общим параметром, определяемым как параметр абстрактного типа класса и создающий его с конкретным значением типа). Сообщение об ошибке выглядит мне незнакомым, хотя я искал его и ничего не нашел; просто пара нерелевантных проблем с тем же сообщением, которое имело ошибки из-за конфликтов имен файлов или классов case с> 21 полями. Поэтому я думаю, что это может быть CouchDB. Какой параметр имеет значение 'db.docs.create'? Разумеется, он не может взять какой-то общий тип 'T', определенный во внешней области. – slouc

+0

Работает ли 'db.docs.create [T] (item)'? – ipoteka

+0

@ipoteka Это не сработало – RemcoW

ответ

0

Просто для тестирования, вы можете переименовать класс Summoner для $ Summoner и тест снова. Код для couchdb-scala пытается получить имя, используя getCanonicalName, и он выдает java.lang.InternalError: Malformed class name. Удивительно .. разве это не так?

Смежные вопросы