2016-12-05 5 views
0

私は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) 
    } 
} 

AbstractRepositorySummonerRepositoryによって拡張されます::よう

マイジェネリック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]) 
     } 
+0

プレーンなScalaの観点からは、すべてがOKです(つまり、抽象クラス型パラメータとして定義されたジェネリックパラメータを持つメソッドがあり、それを具体的な型の値でインスタンス化する)。エラーメッセージは私には馴染みのないように見えますが、私はそれを見つけ出して何も見つけませんでした。ファイル名の衝突や> 21個のフィールドを持つケースクラスのためにエラーが発生した同じメッセージの無関係な問題のほんの一部です。だから、私はそれがCouchDBのことだと思う。 'db.docs.create'はどんな種類のパラメータですか?確かに、外側スコープで定義されたいくつかの一般的な 'T'型を取ることはできません。 – slouc

+0

'db.docs.create [T](item)'は動作しますか? – ipoteka

+0

@ipotekaそれは残念なことに動作しませんでした – RemcoW

答えて

0

ただ、テストのために、あなたがのためにあなたのクラスの召喚士の名前を変更することができます$召喚して再度テストしてください。 couchdb-scalaのコードは、getCanonicalNameを使用して名前を取得しようとし、java.lang.InternalError:不正なクラス名をスローします。それは驚くべきことではありませんか?

関連する問題