gpt4 book ai didi

对于具有部分函数参数方法的基类型,Scala 值类编译失败

转载 作者:行者123 更新时间:2023-12-02 05:17:34 24 4
gpt4 key购买 nike

比如说,我定义了一个值类,如下

package object p {
class ValueClass[T](val o: Option[T]) extends AnyVal {
def foo: Option[T] =
o collect {
case t => t
}
}
}

编译失败并显示消息:

overriding method applyOrElse in trait PartialFunction of type [A1 <: T, B1 >: T](x: A1, default: A1 => B1)B1;
method applyOrElse has incompatible type
o collect {
^

错误消息对我来说似乎没有那么有意义,就像我用 map 替换 collect (它需要一个函数而不是部分函数)或者类没有扩展一样AnyVal,代码片段将编译。

有人可以解释一下背后的原因或链接到已提交的问题吗?

最佳答案

这是一件好事。至少可以在 2.11.0-M8 中运行。

显然,

https://issues.scala-lang.org/browse/SI-8011

完全匹配

https://issues.scala-lang.org/browse/SI-8018

在 2.10.x 上,

scala> trait X[A] { def pf: PartialFunction[A,A] = { case a => a } }
defined trait X

scala> class X[A](val x: A) extends AnyVal { def pf: PartialFunction[A,A] = { case a => a } }
<console>:7: error: overriding method applyOrElse in trait PartialFunction of type [A1 <: A, B1 >: A](x: A1, default: A1 => B1)B1;
method applyOrElse has incompatible type
class X[A](val x: A) extends AnyVal { def pf: PartialFunction[A,A] = { case a => a } }
^

也许这个问题在2.10.3允许之后就不再出现了。

对于病态好奇或无所事事的人,以前有:

https://issues.scala-lang.org/browse/SI-6482

https://issues.scala-lang.org/browse/SI-7022 (重复)

https://issues.scala-lang.org/browse/SI-6187

好的,官方验证这实际上是一个很好的。这是向后端口移植的提交:

commit ff9f60f420c090b6716c927ab0359b082f2299de
Author: Paul Phillips <paulp@improving.org>
Date: Sat Oct 6 10:20:45 2012 -0700

Fix for SI-6482, lost bounds in extension methods.

That was a good one. How to create a new method with type
parameters from multiple sources, herein.

更新显示 2.11.0-M8 做了一些事情:

apm@mara:~/goof$ scalam
Welcome to Scala version 2.11.0-M8 (OpenJDK 64-Bit Server VM, Java 1.7.0_25).
Type in expressions to have them evaluated.
Type :help for more information.

scala> class X[A](val x: A) extends AnyVal { def pf: PartialFunction[A,A] = { case a => a } }
defined class X

scala> :pa -raw
// Entering paste mode (ctrl-D to finish)

package object p {
class ValueClass[T](val o: Option[T]) extends AnyVal {
def foo: Option[T] =
o collect {
case t => t
}
}
}

// Exiting paste mode, now interpreting.


scala> new p.ValueClass(Some(7)).foo
res0: Option[Int] = Some(7)

关于对于具有部分函数参数方法的基类型,Scala 值类编译失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21613666/

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