4
考虑下面的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
的任何类型的课程能帮我做到吗?
嗨查尔斯。我已经想过使用路径依赖类型,可以用它来解决问题中的问题。不幸的是,他们不会在我的具体问题上工作,因为它比我在这里给出的例子稍微复杂一些。尽管如此,如果您提供了针对上述问题的实施方案并加以简要说明,我愿意在此接受您的答案。 –