2
比方說,我有這樣的代碼和平:重寫類型使用「類型」的關鍵字和路徑依賴的類型
trait Holder {
type Value
def put(v:Value)
}
class JsonHolder extends Holder {
override type Value = String
def put(v: JsonHolder.this.Value): Unit = {}
}
class XmlHolder extends Holder {
override type Value = String
def put(v: XmlHolder.this.Value): Unit = {}
}
object Foo {
def main(args: Array[String]) {
val jsonHolder = new JsonHolder
val xmlHodler = new XmlHolder
val valueOfJson = new jsonHolder.Value("AAA")
val valueOfXml = new xmlHodler.Value("AAA")
jsonHolder.put(valueOfXml)
}
}
我不明白爲什麼這個編譯。不應該由類型錯誤jsonHolder.put(valueOfXml)?
如果我改變
type Value
到這樣的事情:
case class Value(content:String)
,取下覆蓋線和其他一切保持原樣是類型不匹配錯誤將實際顯示。
那麼這兩者之間有什麼區別,因爲放置參數的聲明不必改變,行爲完全不同?
好吧,'type'在編譯過程中的行爲就像一個簡單的字符串替換,並且所有的事件只是替換,並且那裏沒有「智能」。 所以有可能這樣做: 而不是'case class Value'將其更改爲'abstract class Value',然後在其他兩個類中重寫它,以便可以修改'Value'類的某些行爲? – almendar
你能否描述一下你想用這個做什麼?我想到的第一件事是參數化 - Holder [T]',和像JsonHolder這樣的類擴展了Holder [String]'。但我想你已經考慮過這個,它可能不適合你的情況 – serejja
其實這並非如此,我有任何問題。我只是在玩我能做的和不能做的路徑依賴類型。 – almendar