Scala:使用函数作为第一类对象的问题

发布于 2024-09-12 06:28:02 字数 200 浏览 3 评论 0原文

我需要一组通用函数,但我无法按照我喜欢的方式完成它。 我创建了一个

List[(Any)=>Unit]

,但是一旦我尝试插入一个函数,例如 a,

String=>Unit

我就会收到错误。如何声明一个不考虑参数和返回值类型的通用函数集合?

I need to have a collection of generic functions, but I can't get it done in the way I like.
I created a

List[(Any)=>Unit]

but as soon as I try to insert a function, for example a

String=>Unit

I get an error. How could I declare a generic function collection that does not consider parameter and return values types?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

捂风挽笑 2024-09-19 06:28:02

函数在输入类型参数中是逆变的,例如在您的情况下Function1[-T1,+R]。这意味着您可以添加 Any => 的实例UnitList[String =>; Unit] 但反之则不然。这当然是有道理的,因为您不能使用 Any 类型的参数来调用需要 String 类型的参数的函数。

Functions are contravariant in the intput type parameters, e.g. in your case Function1[-T1,+R]. This means you can add an instance of Any => Unit to a List[String => Unit] but not the other way round. This of course makes sense as you cannot call a function expecting an argument of type String with an argument of type Any.

舟遥客 2024-09-19 06:28:02

为了完成 @Moritz 的回答,您需要为 T1 选择类型参数,它是列表中每个函数的输入类型的子类型。 Nothing 符合要求——它是每种类型的子类型。

scala> val l: List[Nothing => Any] = List((b: String) => b, (a: Int) => a)
l: List[(Nothing) => Any] = List(<function1>, <function1>)

存在主义类型也适用:

scala> val l: List[_ => _] = List((b: String) => b, (a: Int) => a)        
l: List[Function1[_, _]] = List(<function1>, <function1>)

Just to finish of @Moritz's answer, you need to choose type argument for T1 that is a subtype of the input type of every function in the list. Nothing fits the bill -- it is a subtype of every type.

scala> val l: List[Nothing => Any] = List((b: String) => b, (a: Int) => a)
l: List[(Nothing) => Any] = List(<function1>, <function1>)

An existential type also works:

scala> val l: List[_ => _] = List((b: String) => b, (a: Int) => a)        
l: List[Function1[_, _]] = List(<function1>, <function1>)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文