考虑以下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 }
我正在尝试为代码段中缺少Getter[H <: Holder]
创建隐式构造函数,但即使我尝试了几种约束类型的方法,我也没有得到任何适用于上述两个示例的结果。
这可能与Scala编译器有关吗? shapeless
或scalaz
中的任何类型类都可以帮助我这样做吗?
答案 0 :(得分:0)
您所询问的内容听起来像是Path Dependent Types
的应用其中,您可以根据某些特征/类中定义的类型键入内容,而无需了解具体实现:
val x: Holder#EP = ???
我希望这是你正在寻找的,如果不是,我担心我不完全理解你的问题。