gpt4 book ai didi

scala - Scala 中的广义结构类型一致性

转载 作者:行者123 更新时间:2023-12-04 21:51:28 24 4
gpt4 key购买 nike

我对将特定类型符合更通用的结构类型的问题感兴趣。考虑以下示例:

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方法不符合 Versionable 的 self-type 注释中的签名。但是请注意,如果编译器允许, copy可以像在 Versionable.incrementVersion 中一样被调用.显然,客户的实际签名 copy方法在 Versionable 中的使用过于特殊,因为它带有无关的知识,人们可以选择提供 name范围。

有没有办法解决这些限制?是否有理由认为这种普遍的一致性是个坏主意?

最佳答案

一个问题是,当您阅读此代码时:

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

关于scala - Scala 中的广义结构类型一致性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3471708/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com