我对将特定类型符合更一般结构类型的问题感兴趣。考虑以下示例:Scala中的广义结构类型一致性
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)
}
在这里,客户的copy
方法不符合的版本可控的自我类型的注释签名。但是,请注意,如果编译器允许,则可以调用copy
,就像它在Versionable.incrementVersion
中一样。显然,客户的copy
方法的实际签名对于Versionable中的使用来说太具体,因为它带有无关的知识,可以选择提供name
参数。
是否有办法解决这些限制?是否有理由认为这种广义一致性是一个坏主意?
另一个实际的例子:http://stackoverflow.com/questions/4410469/refactoring-copy-functionality – 2010-12-10 19:48:13