使用'type'关键字和依赖于路径的类型覆盖类型

阿尔门达尔

假设我有一个这样的代码:

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.ValueXmlHolder.Value都是Strings。考虑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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用 c++20 检查 type 是否具有某些值类型和关键字 value_type 本身

type关键字在类型定义中使用时实际上意味着什么?

使用“ type”关键字创建模式匹配时,如何处理HKT类型?

如何在Scala中将依赖于路径的类型与类型类一起使用

使用依赖于lambda函数的类型作为返回类型

使用'typename'关键字将非类型视为依赖上下文中的类型

使用as关键字的嵌套特征类型,有界类型和详细程度

C ++变量在类的所有实例中使用依赖于类的类型和函数具有相同的值

使用“覆盖”关键字

如何在type关键字中使用typeclass?

使用override和new关键字覆盖ToString()

是否有理由在类型和接口前面使用clarify关键字?

在自定义类型上使用声明关键字

使用new []关键字时,类型不完整

使用 infer 关键字创建反向类型查找?

如何使用typeof关键字缩小类型?

类型错误:在函数中使用“ this”关键字的“ Not a function”

我应该为“类型”使用哪个关键字

Kotlin 使用多泛型类型的关键字

类型别名如何使用来指定依赖于模板参数的模板模板参数?

朱莉娅:如何正确定义使用依赖于数字的类型的函数?

使用依赖于上下文绑定的选择编写类型类

与使用“is”的关键字“list”和“set”相比,为什么空列表和集合上的 type() 会产生不同的答案?

使用“typename”关键字将非类型“pcl::PointCloud<PointT>::Ptr [with PointT=T]”视为依赖上下文中的类型C/C++(2675)

如何使用Type类型的变量作为Type?

如何在Swift中使用保留关键字作为类型名称声明和初始化嵌套枚举?

当修改依赖于索引时,如何使用镜头修改嵌套自定义数据类型的字段

如何使用本身就是模板的类型来专门化模板方法,其中仅返回类型依赖于模板类型?

为什么在Python中使用type.Generic时保留cls关键字属性?