我不确定问题标题的措辞是否恰当,所以我会详细说明。
sealed trait RedisKey[A] {
type valueType = A
def name: String
}
case object FirstName extends RedisKey[String] { val name = "first_name" }
case object Age extends RedisKey[Int] { val name = "age" }
trait Redis {
def fetch(key: RedisKey)// : key.valueType
}
我需要通过fetch
的依赖类型 RedisKey
约束valueType
的返回类型(不确定这是否是正确的术语)。但显然,上面的内容不会起作用,因为在我可以访问其依赖类型之前我需要RedisKey
的具体实例。
是否有可能以任何方式实现这一目标?
答案 0 :(得分:6)
您也可以使用依赖类型:
sealed trait RedisKey {
type valueType
def name: String
}
case object FirstName extends RedisKey { type valueType = String; val name = "first_name" }
case object Age extends RedisKey { type valueType = Int; val name = "age" }
trait Redis {
def fetch(key: RedisKey): key.valueType
}
(null: Redis).fetch(Age): Int
(null: Redis).fetch(FirstName): String
最后两行用于测试repl中方法的返回类型。
答案 1 :(得分:1)
在发布这个问题后约5分钟结束时,我意识到我正在过度思考这个问题。
以下工作没有依赖类型hackery。
sealed trait RedisKey[A] {
def name: String
}
case object FirstName extends RedisKey[String] { val name = "first_name" }
case object Age extends RedisKey[Int] { val name = "age" }
trait Redis {
def fetch[A](key: RedisKey[A]): A
}