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
的任何類型的課程能幫我做到嗎?
嗨查爾斯。我已經想過使用路徑依賴類型,可以用它來解決問題中的問題。不幸的是,他們不會在我的具體問題上工作,因爲它比我在這裏給出的例子稍微複雜一些。儘管如此,如果您提供了針對上述問題的實施方案並加以簡要說明,我願意在此接受您的答案。 –