为什么可以';我重写了一个在Scala中以值类作为参数的方法吗?

为什么可以';我重写了一个在Scala中以值类作为参数的方法吗?,scala,overriding,value-class,Scala,Overriding,Value Class,我在Scala 2.10.3中使用值类(扩展AnyVal的类),但在将它们用作抽象方法的参数时遇到了一个奇怪的编译器错误。 如下例所示: class ValueClass(val x: Int) extends AnyVal trait Test { def foo(v: ValueClass): Int } new Test { override def foo(v: ValueClass): Int = 1 } 编译器抛出以下错误: error: bridge generate

我在Scala 2.10.3中使用值类(扩展AnyVal的类),但在将它们用作抽象方法的参数时遇到了一个奇怪的编译器错误。 如下例所示:

class ValueClass(val x: Int) extends AnyVal

trait Test {
  def foo(v: ValueClass): Int
}

new Test {
  override def foo(v: ValueClass): Int = 1
}
编译器抛出以下错误:

error: bridge generated for member method foo: (v: ValueClass)Int in anonymous class $anon
which overrides method foo: (v: ValueClass)Int in trait Test
clashes with definition of the member itself;
both have erased type (v: Int)Int
          override def foo(v: ValueClass): Int = 1

为什么这样不行?有没有办法将值类传递到抽象方法中

正如其他人所指出的,这个问题已在以后的版本中修复。如果你对发生了什么变化感到好奇,我建议你看看这个

SI-6260在擦除底层方法签名中的值类后,使用lambdas over value class避免双def错误 当删除的签名与泛型重叠时,类型会造成严重破坏 来自重写方法的签名。两者都没有空间。 但我们真的需要两者;接口方法的调用方将是 传递桥接器需要取消装箱并传递给 接受非固定值的特定方法

这通常出现在擦除到对象的值类中 用作匿名的参数或返回类型 功能

这被认为是难以解决的问题,除非我们选择不同的解决方案 子类中未装箱的特定方法的名称。但是听起来 就像一个需要重新编写调用站点的大任务一样,ala 专业化

但有一个重要的特殊情况,我们不需要这样做 重写呼叫站点。如果定义方法的类是匿名的, 实际上不需要非固定方法;它只会永远 可以通过泛型方法调用

当我看到Java8Lambda是如何工作的时候,我意识到了这一点 处理。我期待着桥接方法,但没有找到。兰姆达酒店 正文直接放置在与泛型完全匹配的方法中 签名

此提交检测网桥和目标之间的冲突,并进行恢复 通过篡改目标方法的 象征。这用作字节码名称。通用桥前进 与以前一样,使用必要的box/unbox操作


升级至最新的stable Scala版本,目前为2.11.1。您的代码片段在那里工作。也在Scala 2.10.4 REPL中编译。仅供参考,我在Scala REPL 2.10.1中遇到了相同的错误