2014-09-03 101 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. 
*/ 
...