我有一份烫伤的工作。我创造了两个特征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'?
之前可能缺少分号答案 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太多而且编译器无法处理所有这些