【发布时间】:2017-04-24 20:39:25
【问题描述】:
考虑以下 Scala 代码:
trait Elem
class MyElem extends Elem
trait Holder {
type EP <: Elem
def get: EP
}
class MyHolder(e: MyElem) extends Holder {
type EP = MyElem
def get = e
}
根据我的对象类型是 Holder 还是 MyHolder,调用 get 可能会分别返回 Elem 或 MyElem。我正在尝试在类型级别提供该信息,但我没有得到任何结果。例如,考虑像这样的Getter 类型类:
trait Getter[From] {
type Out
def get(from: From): Out
}
object Getter {
type Aux[From, Out0] = Getter[From] { type Out = Out0 }
def apply[From](implicit getter: Getter[From]): Getter.Aux[From, getter.Out] = getter
// some way to create a `Getter[H <: Holder]`
// where `Out` is the most specific type known for `H#EC`
}
Getter[MyHolder] // should return a MyHolder { type Out = MyElem }
Getter[Holder] // should return a Holder { type Out = Elem }
我正在尝试为 sn-p 中缺少的 Getter[H <: Holder] 创建隐式构造函数,但即使我尝试了几种限制类型的方法,我也没有得到适用于上述两个示例的任何结果。
这可能与 Scala 编译器有关吗? shapeless 或 scalaz 的任何类型类可以帮助我做到这一点吗?
【问题讨论】: