2016-12-05 97 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:格式错误的类名称。令人惊叹的..不是吗?