0

我最近尝试了Scala 函数式编程中的一些并发练习的变体 (很棒的书,顺便说一句.. 早期访问版可免费下载!)。第 7 章涉及创建一个单子类型构造函数 Par[X],它允许任何类型 X 的表达式在与ExectutorService配对时被分叉并并行运行

我尝试的变体是创建一个 API,允许调用者将并行表达式(参数化类型 Par[X] 的实例)平面映射在一起。我想要一些与 Option/Some/None 类似的东西,如果其中一个平面图导致链中的一个恰好是失败(在 Option 的情况下为“无”),那么该失败会“冒泡”到top,这样构造链的调用者只需要检查顶层返回值是不是错误前哨即可。(希望从这个解释中我想要做的很清楚)。无论如何...我在构建错误标记时遇到了问题。

我尝试以两种方式构造它,作为案例对象和作为案例类。在第一个实例中,案例对象,我得到了这个错误

    Object creation impossible since member get():V in java.util.concurrent.future is not defined.

这是我的第一种情况的代码:

    case object Failure extends Future[Nothing] {
    def isDone = true

    // why is compiler telling me i'm not defining this, when def'n is below?
    def get(timeout: Long, units: TimeUnit) =  
        throw new NoSuchElementException("nothing to get from failure")

    def isCancelled = false

    def cancel(evenIfRunning: Boolean): Boolean = false
    }

然后我尝试使用从 Future[Nothing] 扩展的案例类,如下所示:

  case class Failure2 extends Future[Nothing] {
    def isDone = true

    def get(timeout: Long, units: TimeUnit) =  throw new NoSuchElementException("nothing to get from failure")

    def isCancelled = false

    def cancel(evenIfRunning: Boolean): Boolean = false
  }

这导致了以下错误:

class Failure2 must be declared abstract or implement abstract member get():V in java.util.concurrent.future 

如果你们中的任何一位专业的 Scala API 构建者可以帮助指导我找到解决方案,我将不胜感激!

4

2 回答 2

0

这个答案补充了丹的回答,他在其中指出了我的错误(谢谢,丹!)。我希望这个答案/评论可以帮助其他人避免同样被咬。当我编写我的“失败”案例类/对象时,我正在查看原始代码库中的一个案例类,它以一种对我来说并不明显的方式实现了 Future 的无参数 get()。这是代码:

      private case class UnitFuture[A](get: A) extends Future[A] {
        def isDone = true

        def get(timeout: Long, units: TimeUnit) = get

        def isCancelled = false

        def cancel(evenIfRunning: Boolean): Boolean = false
      }

在这段代码中,由于 get 是案例类构造函数的参数,因此似乎隐式实现了无参数 get() 方法......我什至没有意识到这个方法存在,所以我忽略了在我的失败类(因此我遇到的错误方法)。如果我很聪明,我会直接查看 Future 的 javadoc 以查看需要哪些方法....但是我基于对“UnitFuture”类所需内容的假设,我错过了没有 arg get( ) 是该课程的一部分。哦,好吧..生活和学习;^)希望这可以帮助其他人不要重复我的错误。

于 2015-08-07T22:18:45.427 回答
0

当错误消息指

会员get():V_java.util.concurrent.Future

他们指的是没有参数get()方法Future,你确实忘记实现了。我猜你希望两个版本都get()做同样的事情。您只需要明确说明即可。例如:

def get() = throw ...
def get(timeout: Long, units: TimeUnit) = get()
于 2015-08-07T03:19:43.007 回答