2014-09-03 92 views
0

我目前正在试图了解斯卡拉(2.10.2)迭代器和他们的行为。我有兴趣使用诸如filtermap这样的方法,这些方法根据互联网上的各个地方而被懒惰地实现,这很有帮助。斯卡拉迭代器抽象方法

但是,当我实现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 = [email protected] 

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 = [email protected] 

scala> s.next 
res0: Int = 0 

scala> s.filter(_ < 3) 
java.lang.AbstractMethodError: SillyIterator.filter(Lscala/Function1;)Lscala/collection/Iterator; 
    at .<init>(<console>:13) 
    ... 
+0

您的代码在Scala 2.10.1上工作于REPL – ccheneson 2014-09-03 09:03:28

+0

粘贴模式是解决方案,但获取REPL中的AbstractMethodError是一个错误。你是如何编写该课程的?你能显示完整的REPL会话吗? – gourlaysama 2014-09-03 09:50:40

回答

0

你的代码应该工作得很好的IDE,但有可能是在工作表和REPL一些问题。

为了避免这些问题,只是移动至托架到第一行。就像这样:

class SillyIterator extends Iterator[Int]{ 
    private var i = 0 

    def hasNext : Boolean = i < 10 

    def next() : Int = { 
    val ret = i 
    i += 1 
    ret 
    } 
} 

在你的情况,你有类SillyIterator

class SillyIterator extends Iterator[Int] 

随后的代码在大括号块的定义。

0

你的代码工作在REPL很好,你不使用:pa需要拉升花括号(虽然我个人认为语法刺激性),你需要做的是在粘贴模式输入:

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

class SillyIterator extends Iterator[Int] 
{ 
    private var i = 0 

    def hasNext : Boolean = i < 10 

    def next() : Int = 
    { 
     val ret = i 
     i += 1 
     ret 
    } 
} 

// Exiting paste mode, now interpreting. 

defined class SillyIterator 

scala> new SillyIterator 
res15: SillyIterator = non-empty iterator 

scala> res15.filter(_ > 3) 
res16: Iterator[Int] = non-empty iterator 

scala> res15.filter(_ > 3).toList 
res17: List[Int] = List(5, 6, 7, 8, 9) 

如果不使用粘贴模式的新生产线将在REPL没关系,这是你会得到什么,如果你不使用它(或在上线的花括号移动):

scala> class SillyIterator extends Iterator[Int] 
<console>:7: error: class SillyIterator needs to be abstract, since: 
it has 2 unimplemented members. 
/** As seen from class SillyIterator, the missing signatures are as follows. 
* For convenience, these are usable as stub implementations. 
*/ 
...