【发布时间】:2014-10-27 16:17:28
【问题描述】:
我目前正在尝试了解 Scala (2.10.2) 迭代器及其行为。我有兴趣使用filter和map等方法,根据网上的各个地方,都是懒惰实现的,很有帮助。
但是,当我实现 Iterator[T] 接口时,在其上调用 filter 会引发 java.lang.AbstractMethodError。谁能解释一下为什么?
一个例子:
class SillyIterator extends Iterator[Int]
{
private var i = 0
def hasNext : Boolean = i < 10
def next() : Int =
{
val ret = i
i += 1
ret
}
}
然后在控制台中:
scala> new SillyIterator
res20: SillyIterator = SillyIterator@4659d97
scala> res20.filter( _ > 3 )
java.lang.AbstractMethodError: SillyIterator.filter(Lscala/Function1;)Lscala/collection/Iterator;
...
编辑:
这不是由粘贴模式问题引起的。如果我将整个类定义为单行,它仍然会失败:
scala> class SillyIterator extends Iterator[Int]{ private var i = 0; def hasNext : Boolean = i < 10; def next() : Int = { val ret = i; i += 1; ret } }
defined class SillyIterator
scala> val s = new SillyIterator
s: SillyIterator = SillyIterator@5bf1effb
scala> s.next
res0: Int = 0
scala> s.filter( _ < 3 )
java.lang.AbstractMethodError: SillyIterator.filter(Lscala/Function1;)Lscala/collection/Iterator;
at .<init>(<console>:13)
...
【问题讨论】:
-
您的代码在 REPL 上使用 Scala 2.10.1
-
粘贴模式是解决方案,但在 REPL 中获取
AbstractMethodError是一个错误。你是如何编译那个类的?你能展示完整的 REPL 会话吗?