如何创建抽象Function1 trait的实现

4

我是Scala的新手。我对下面的代码为什么会抛出异常感到很困惑。我知道Function1[Int, Int]有一个类型为Int => Int的抽象apply方法需要被定义。下面的oddfunc不是已经定义了吗?为什么x(3)没有调用在oddfunc中定义的具体apply方法呢?

Welcome to Scala version 2.11.5 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_25).
Type in expressions to have them evaluated.
Type :help for more information.

scala> trait oddfunc extends Function1[Int,Int] {
 | def apply(a: Int): Int = a+3
 | }
defined trait oddfunc

scala> val x = new oddfunc{}
x: oddfunc = <function1>

scala> x(3)
java.lang.AbstractMethodError: $anon$1.apply$mcII$sp(I)I
  at oddfunc$class.apply(<console>:8)
  at $anon$1.apply(<console>:8)
  ... 43 elided

1
非常奇怪。从视觉检查来看,你的代码似乎没问题。我将你的完整代码复制粘贴到我的REPL中,它按预期完美地运行了。 - acjay
可能是环境问题。你使用的Scala版本是哪个?还是Java? - ntilwalli
1
2.11.0 和 1.7.0_25。但是你的示例非常平凡,应该在任何地方都可以运行。 - acjay
我不确定,但可能是编译器的Bug?如果你用class替换trait,你的代码在我的机器上可以正常工作。如果我使用trait,我会遇到同样的错误。 - Mellson
我使用Scala代码运行器版本2.11.4和Java版本1.7.0_60在Yosemite上运行了您的代码,它完美地工作了! - Nami
我很感激你们的回应,非常有帮助。我原本以为这是我不理解Scala语言的问题,后来发现是编译器出了问题。2.11.5版本有这个问题,而2.11.4版本却没有。 - ntilwalli
1个回答

2

这似乎是Scala编译器在2.11.4和2.11.5之间引入的一个bug。我降级到Scala 2.11.4,看看是否能解决问题,结果确实如此。

Welcome to Scala version 2.11.4 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_25).
Type in expressions to have them evaluated.
Type :help for more information.

scala> trait oddfunc extends Function1[Int,Int] {
     | def apply(a: Int): Int = a+3
     | }
defined trait oddfunc

scala> val x=new oddfunc{}
x: oddfunc = <function1>

scala> x(3)
res0: Int = 6

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接