Kotlin 中的接口Map(使用 V1.6.21)的签名为
interface Map<K, out V>
Run Code Online (Sandbox Code Playgroud)
为什么是K不变而不是协变(out K)?
类型参数的文档K说:
映射的键类型是不变的,因为它可以接受键作为参数(例如 containsKey)并在键集中返回它。
但是,接口Set在元素类型中是协变的,因此最后一部分(“在键集中返回它”)不适用,至少不立即适用。
此外,类型参数K仅在未修改映射状态的情况下使用,以用于查找目的(方法containsKey、get、getOrDefault)。在这些地方使用不安全吗@UnsafeVariance?毕竟,相同的技术也被应用于 的Map值类型参数V(例如 中)containsValue,以允许V协变。
我想提供一个 GraphQL 服务,该服务在单个事务中运行整个变异操作(全部或不改变)。
顶级字段在单个事务中串行处理并相应地更改数据库。只有在执行过程中没有错误时,才应该将更改提交到数据库,否则它们应该全部回滚。
现在我有两个问题:
根据 GraphQL 规范,顶级字段的串行执行意味着每个顶级字段都将填充一个反映其修改后状态的值,然后才能知道后面的字段是否会导致错误。当后面的顶级字段导致回滚事务的错误时,这是否不是该字段的实际值?
如果顶级字段的突变失败,则执行以下顶级字段是没有意义的,因为事务可能处于阻止进一步处理的状态,并且无论如何都会回滚所有更改。根据 GraphQL 语义,是否可以跳过这些字段的执行(返回 null 并且可能是错误列表的条目)?