Scala中的广义结构类型一致性
发布时间:2020-12-16 18:29:25 所属栏目:安全 来源:网络整理
导读:我对将特定类型符合更一般结构类型的问题感兴趣.请考虑以下示例: trait Suptrait Sub extends Suptype General = { def contra(o: Sub): Unit def co(): Sup def defaults(age: Int): Unit def defaults2(age: Int): Unit def defaults3(first: String): Un
我对将特定类型符合更一般结构类型的问题感兴趣.请考虑以下示例:
trait Sup trait Sub extends Sup type General = { def contra(o: Sub): Unit def co(): Sup def defaults(age: Int): Unit def defaults2(age: Int): Unit def defaults3(first: String): Unit } trait Specific { def contra(o: Sup): Unit // doesn't conform def co(): Sub // conforms def defaults(age: Int,name: String = ""): Unit // doesn't conform def defaults2(name: String = "",age: Int = 0): Unit // doesn't conform def defaults3(first: String = "",last: String = ""): Unit // doesn't conform } 在每个不符合的情况下,对General中方法的调用可以安全地解析为Specific中的相应方法.在this question中可以找到更有趣的实际示例: trait Versionable[T] { self: { def copy(version: Int): T } => val version = 0 def incrementVersion = copy(version = version + 1) } case class Customer(name: String,override val version: Int) extends Versionable[Customer] { def changeName(newName: String) = copy(name = newName) } 这里,Customer的复制方法不符合Versionable的自我类型注释中的签名.但请注意,如果编译器允许,则可以像在Versionable.incrementVersion中一样调用copy.显然,Customer的复制方法的实际签名过于具体,无法在Versionable中使用,因为它带有无关的知识,可以选择提供名称参数. 有办法解决这些限制吗?是否有理由认为这种普遍的一致性是个坏主意? 解决方法
一个问题是,当您阅读此代码时:
self: { def copy(version: Int): T } 你不希望参数的名称是重要的,因为它必须在这个例子中: case class Robot(number: Int,override val version: Int) extends Versionable[Robot] 编辑:另一方面,关于方法缺乏参数反演,你可以这样做: type General = { val contra: (Sub => Unit) } class B { val contra = ((o:Sup) => println(o)) } var b:General = new B (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |