无法派生类型
问题描述:
我正在使用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])
}
答
只是用于测试,你可以为你的类召唤师的$ Summoner并再次测试。 couchdb-scala的代码尝试使用getCanonicalName获取名称,并抛出java.lang.InternalError:格式错误的类名称。令人惊叹的..不是吗?
从普通的Scala的角度来看,一切都可以(即,将泛型参数定义为抽象类类型参数并使用具体类型值实例化该方法)。这个错误信息对我来说看起来并不熟悉,所以我把它们搜索起来并没有发现任何东西;只是由于文件名冲突或具有> 21个字段的案例类相同的消息导致了一些无关紧要的问题。所以我认为这可能是一个CouchDB的事情。 'db.docs.create'采取什么样的参数?当然,它不能在外部范围中定义一些通用的'T'类型。 – slouc
'db.docs.create [T](item)'工作吗? – ipoteka
@ipoteka无法工作不幸 – RemcoW