假设我有一个这样的代码:
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)
并删除替代行,其他所有内容都将保留,因为它实际上是类型不匹配错误。
那么,由于put参数的声明不必更改且行为完全不同,因此两者之间有什么区别?
好吧,这不是类型错误,因为JsonHolder.Value
和XmlHolder.Value
都是String
s。考虑type
其他类型的别名。所有类型均替换为其实际类型。因此,您的代码大致如下所示:
val valueOfJson = new String("AAA") // JsonHolder.Value is a String
val valueOfXml = new String("AAA") // XmlHolder.Value is a String as well
像这样:
class JsonHolder extends Holder {
def put(v: String): Unit = {}
}
class XmlHolder extends Holder {
def put(v: String): Unit = {}
}
例如,如果您的一种类型是,Int
那么请确保您会收到编译错误:
class JsonHolder extends Holder {
override type Value = Int
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
//compilation error here - Int doesn't have a String constructor
val valueOfJson = new jsonHolder.Value("AAA")
val valueOfXml = new xmlHodler.Value("AAA")
jsonHolder.put(valueOfXml)
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句