私はScalaとCouchDBを使用しており、オブジェクトをデータベースに格納するための一般的な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
によって拡張されます::よう
マイジェネリックsave
方法が見えます
Error:(24, 34) Couldn't derive type T db.docs.create(item)
I:私は、私はこのエラーを取得し、これをコンパイルしよう
class SummonerRepository extends AbstractRepository[Summoner] {
val mapping = TypeMapping(classOf[Summoner] -> "Summoner")
val db = couch.db("summoner-db", mapping)
}
なぜこれが導き出せないのか分からない。なぜこれがあり、このエラーを回避する方法がありますか?
編集:私はSummoner
にタイプを唱えたとき、それは完璧に動作しますが、それはもはや一般的なされませんように、そのは使用です:
def save(item: T): Unit = {
db.docs.create(item.asInstanceOf[Summoner])
}
プレーンなScalaの観点からは、すべてがOKです(つまり、抽象クラス型パラメータとして定義されたジェネリックパラメータを持つメソッドがあり、それを具体的な型の値でインスタンス化する)。エラーメッセージは私には馴染みのないように見えますが、私はそれを見つけ出して何も見つけませんでした。ファイル名の衝突や> 21個のフィールドを持つケースクラスのためにエラーが発生した同じメッセージの無関係な問題のほんの一部です。だから、私はそれがCouchDBのことだと思う。 'db.docs.create'はどんな種類のパラメータですか?確かに、外側スコープで定義されたいくつかの一般的な 'T'型を取ることはできません。 – slouc
'db.docs.create [T](item)'は動作しますか? – ipoteka
@ipotekaそれは残念なことに動作しませんでした – RemcoW