【问题标题】:Scala implicit def complains about return type with member defs?Scala 隐式 def 抱怨返回类型与成员 defs?
【发布时间】:2012-09-25 01:30:53
【问题描述】:

定义了以下隐式 def,旨在实现 Akka Actor 事件总线所需的一些方法。此处的文档中概述了所需的方法:http://doc.akka.io/docs/akka/2.0/scala/event-bus.html#Subchannel_Classification

protected implicit def subclassification: Subclassification[Classifier] = {
      def isEqual(a: Classifier, b: Classifier): Boolean = {
        a.equals(b)
      }

      def isSubclass(a: Classifier, b: Classifier): Boolean = {
        a.startsWith(b)
      }

  }

但是,当我去编译它时,我得到了错误:type mismatch; found : Unit required: akka.util.Subclassification[MessageBus.this.Classifier]

以下是文档的具体要求:

subclassification: Subclassification[Classifier] 是一个对象 提供 isEqual(a: Classifier, b: Classifier) 和 isSubclass(a: Classifier, b: Classifier) 被this的其他方法消费 分类器。

我知道这将返回一个单元,但我将如何使必要的实现也可以提供这些成员方法?

【问题讨论】:

    标签: scala


    【解决方案1】:

    您的意思是实例化Subclassification[Classifier] 的子类吗?如果是这样,您需要说 new Subclassification[Classifier] 以便 Scala 知道您要做什么。

    protected implicit def subclassification: Subclassification[Classifier] = 
      new Subclassification[Classifier] {
        def isEqual(a: Classifier, b: Classifier): Boolean = {
          a.equals(b)
        }
    
        def isSubclass(a: Classifier, b: Classifier): Boolean = {
          a.startsWith(b)
        }
    }
    

    它抱怨的原因是因为您为变量subclassification 分配了一个仅包含两个函数声明的代码块。由于 Scala 总是假定块中的最后一个表达式是表达式的计算结果,并且函数声明的类型是 Unit(基本上意味着它不计算任何东西),Scala 说整个块都有类型Unit。

    由于您将块分配给变量subclassification,因此subclassification 的类型必须为Unit。但是你明确声明类型应该是Subclassification[Classifier],所以不匹配,你会得到一个错误。

    【讨论】:

    • 显然是这样,这绝对是我的误解。谢谢。我还会注意到它需要import akka.util.Subclassification 供未来的搜索者使用;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-09
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 2015-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多