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)
我不明白爲什麼不能派生出來。爲什麼是這樣的,是否有解決這個錯誤的方法?
編輯:當我投的類型Summoner
它完美的作品,但是這是沒有用的,因爲它不會是通用了:
def save(item: T): Unit = {
db.docs.create(item.asInstanceOf[Summoner])
}
從普通的Scala的角度來看,一切都可以(即,將泛型參數定義爲抽象類類型參數並使用具體類型值實例化該方法)。這個錯誤信息對我來說看起來並不熟悉,所以我把它們搜索起來並沒有發現任何東西;只是由於文件名衝突或具有> 21個字段的案例類相同的消息導致了一些無關緊要的問題。所以我認爲這可能是一個CouchDB的事情。 'db.docs.create'採取什麼樣的參數?當然,它不能在外部範圍中定義一些通用的'T'類型。 – slouc
'db.docs.create [T](item)'工作嗎? – ipoteka
@ipoteka無法工作不幸 – RemcoW