【问题标题】:Scala Iterator Filter Abstract MethodScala 迭代器过滤器抽象方法
【发布时间】:2014-10-27 16:17:28
【问题描述】:

我目前正在尝试了解 Scala (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 = 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 会话吗?

标签: scala iterator


【解决方案1】:

您的代码在 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.
 */
...

【讨论】:

    【解决方案2】:

    您的代码在 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]
    

    后面是花括号中的代码块。

    【讨论】:

      猜你喜欢
      • 2020-07-28
      • 2013-12-28
      • 2015-07-27
      • 2017-04-25
      • 2016-02-29
      • 1970-01-01
      • 2012-11-20
      • 2015-10-04
      • 1970-01-01
      相关资源
      最近更新 更多