烫伤,在Job中不能使用多个特征

时间:2014-08-22 13:19:42

标签: scala traits scalding

我有一份烫伤的工作。我创造了两个特征A,B,每个特征都有伴侣对象A,B,其中包含特征和管道。

当我只使用一个特征时,

作业编译成功。当我导入两个特征时,编译失败。它说来自traits的所有方法都是"不是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  class TraitBWrapper(val self:RichPipe)使用TraitB扩展AnyRef

现在编译器抱怨:

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

值otherMethodFromTraitA不是cascading.pipe.Pipe的成员 可能的原因:在'value otherMethodFromTraitA'?

之前可能缺少分号

1 个答案:

答案 0 :(得分: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旁边。

可能是因为implicits太多而且编译器无法处理所有这些