gpt4 book ai didi

scala - 当参数不符合类型约束时,为什么这个 Scala 函数会编译?

转载 作者:行者123 更新时间:2023-12-03 20:51:14 25 4
gpt4 key购买 nike

假设我有一个名为 Marker 的空标记特征以及一些类型参数受 Marker 约束的函数:

trait Marker

object Marker {
def works[M <: Marker](m:M):M = m
def doesntWork[M <: Marker](f:M => String):String = "doesn't matter"
}

第一个功能按我的预期工作。也就是说,如果您传递的参数不是 Marker ,那么代码不会编译:
scala> works("a string")
<console>:14: error: inferred type arguments [String] do not conform to method works's type parameter bounds [M <: com.joescii.Marker]
works("a string")
^
<console>:14: error: type mismatch;
found : String("a string")
required: M
works("a string")
^

但是,我可以将一个参数传递给不符合 Marker 的第二个函数。 .具体来说,我可以传递一个 String => String 类型的函数代码愉快地编译并运行:
scala> doesntWork( (str:String) => "a string" )
res1: String = doesn't matter

我希望这个电话是 doesntWork无法编译。谁能向我解释为什么它会编译以及我如何更改函数签名以防止在这种情况下检查类型?

全面披露:上述人为例子是 this outstanding issue for lift-ng的简化版本.

最佳答案

由于逆变,代码编译。您可以通过显式提供推断类型参数来看到这一点:

doesntWork[Nothing]((str: String) => "a string")

这是一个普遍的问题。有多种技术可以解决这个问题,但它们通常归结为约束 T成为某种类型类的实例。

关于scala - 当参数不符合类型约束时,为什么这个 Scala 函数会编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31907701/

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