0

我有一份烫伤的工作。我创建了两个特征 A,B 每个特征都有伴生对象 A,B,其中包含 trait 和 Pipe 的隐式包装。

当我只使用一个特征时,作业编译成功。当我导入这两个特征时,编译失败。它说来自特征的所有方法“不是 cascading.pipe.Pipe 的成员”

为什么?我做错了什么?如果我评论A的导入。B.,它编译。

class ScaldingJob(args: Args) extends Job(args) {
  import logic.TraitA._
  import logic.TraitB._

  val pipeA = UnpackedAvroSource(args("input1")).read
              .methodFromTraitA

  val pipeB = UnpackedAvroSource(args("input2")).read
              .methodFromTraitB           
}


trait TraitA extends FieldConversions {

  def self: RichPipe

  def methodFromTraitA : Pipe = self
    .map(/***/)  
}

object TraitA {

  implicit class TraitAWrapper(val self: RichPipe) extends AnyRef with TraitA
  implicit def wrapPipe(self: cascading.pipe.Pipe): TraitAWrapper = new TraitAWrapper(new RichPipe(self))
}


trait TraitB extends FieldConversions {

  def self: RichPipe

  def methodFromTraitB : Pipe = self
    .map(/***/)  
}

object TraitB {

  implicit class TraitBWrapper(val self: RichPipe) extends AnyRef with TraitB
  implicit def wrapPipe(self: cascading.pipe.Pipe): TraitBWrapper = new TraitBWrapper(new RichPipe(self))
}

UPD,我已经更改了代码:

  val readInput1: TraitA= UnpackedAvroSource(args("input1")).read
  val pipeA = readInput1.methodFromTraitA

  val pipeB = UnpackedAvroSource(args("input2")).read
          .methodFromTraitB      

并删除了隐含:

类 TraitAWrapper(val self: RichPipe) 使用 TraitA 扩展 AnyRef 类 TraitBWrapper(val self: RichPipe) 使用 TraitB 扩展 AnyRef

现在编译器抱怨:

val readInput1: TraitA= UnpackedAvroSource(args("input1")).read
      val pipeA = readInput1.methodFromTraitA
                            .otherMethodFromTraitA

value otherMethodFromTraitA 不是 cascading.pipe.Pipe 的成员可能的原因:可能在 `value otherMethodFromTraitA' 之前缺少分号?

4

1 回答 1

1

可能不是您期望的答案,但如果您给 Scala 编译器一个提示,它将能够编译:

class ScaldingJob(args: Args) extends Job(args) {
  import logic.TraitA._
  import logic.TraitB._

  val readInput1: TraitA= UnpackedAvroSource(args("input1")).read
  val pipeA = readInput1.methodFromTraitA

  val pipeB = UnpackedAvroSource(args("input2")).read
          .methodFromTraitB           
}

您还需要删除 TraitAWrapper 和 TraitBWrapper 旁边的“隐式”。

可能是隐式发生了太多事情,编译器无法处理所有这些

于 2014-08-22T16:25:30.950 回答