2016-12-05 93 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)

我不明白爲什麼不能派生出來。爲什麼是這樣的,是否有解決這個錯誤的方法?

編輯:當我投的類型Summoner它完美的作品,但是這是沒有用的,因爲它不會是通用了:

def save(item: T): Unit = { 
     db.docs.create(item.asInstanceOf[Summoner]) 
     } 
+0

從普通的Scala的角度來看,一切都可以(即,將泛型參數定義爲抽象類類型參數並使用具體類型值實例化該方法)。這個錯誤信息對我來說看起來並不熟悉,所以我把它們搜索起來並沒有發現任何東西;只是由於文件名衝突或具有> 21個字段的案例類相同的消息導致了一些無關緊要的問題。所以我認爲這可能是一個CouchDB的事情。 'db.docs.create'採取什麼樣的參數?當然,它不能在外部範圍中定義一些通用的'T'類型。 – slouc

+0

'db.docs.create [T](item)'工作嗎? – ipoteka

+0

@ipoteka無法工作不幸 – RemcoW

回答

0

只是用於測試,你可以爲你的類召喚師的$ Summoner並再次測試。 couchdb-scala的代碼嘗試使用getCanonicalName獲取名稱,並拋出java.lang.InternalError:格式錯誤的類名稱。令人驚歎的..不是嗎?