显然,这不完全是我的用例,但这是 MCVE,演示了问题:
def bad = {
val in: ZLayer[Any, Any, String] = null
val layer: ZLayer[String with Int with Double, Any, Double] = null
val out: ZLayer[Any & Int, Any, Double] = in >>> layer
}
这应该有效,对吧?Intellij 同意,并说一切都是正确的......直到你点击编译。编译器说:
found : zio.ZLayer[String with Int with Double,Any,Double]
required: zio.ZLayer[String with Any with Int,Any,Double]
什么???为什么?
有趣的是,如果您将第一个更改Double
为 a String
(或者如果您调整类型则更改为其他任何内容out
),它可以正常工作:
def good = {
val in: ZLayer[Any, Any, String] = null
val layer: ZLayer[String with Int with String, Any, Double] = null
val out: ZLayer[Any & Int, Any, Double] = in >>> layer
}
有任何想法吗?我开始想,这是一个编译器错误吗?
某种类型的俄罗斯方块:)让我们想象一下,这里发生了什么:
当您组合
in
和layer
到 时in >>> layer
,会从 所需的内容中in
删除,但生成的层仍然需要其余部分 (和)。但是,示例中的类型注释指出它只需要,这是不正确的。String
layer
Int
Double
out
bad
Int
请注意,有不同的方法可以修复以下错误
bad
:Double
到需要的内容out
Double
从需要的内容中删除layer
Double
到提供的内容in
似乎编译器考虑了
out
修复的类型,并建议了第二种解决方案,这正是您在 中所做的good
。