【发布时间】:2014-02-20 03:50:35
【问题描述】:
这个例子被简化了。
我有一组这样的类:
case class KeyMapping[KeyType](k:KeyType)
class WrappedMapping[KeyType](m:T forSome {type T <: KeyMapping[KeyType]}) {
val k:KeyType = ???
}
在以下代码中,类型被正确推断:
val w = new WrappedMapping(KeyMapping("key"))
//The statement below gives the correct error
//type mismatch;
// found : w.k.type (with underlying type String) required: Nothing
//val test1:Nothing = w.k
我不知道如何正确推断以下类型:
class Mappings[KeyType, L <: HList](mappings:L) {
val k:KeyType = ???
}
val m = new Mappings(KeyMapping("key1") :: KeyMapping("key2") :: HNil)
// should not compile, k should be of type String
val test2:Nothing = m.k
有没有办法可以根据HList 的内容推断KeyType?
【问题讨论】:
-
您有什么理由不使用签名
class WrappedMapping[KeyType](m: KeyMapping[KeyType])?现在,这种存在主义的类型就像拇指酸痛一样突出,这肯定会让这个问题更难回答。 -
其实,没关系。我看到
WrappedMapping没有在Mappings中使用 -
您是否只想确定
HList中的所有映射都具有相同的密钥类型?目标有点不清楚。 -
我希望
Mappings中的KeyType被推断为键类型的上限。如果正确推理的唯一解决方案是只允许一种类型的密钥,那也很好。只要是从HList中的KeyMappings推断出来的。