我有一份烫伤的工作。我创建了两个特征 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' 之前缺少分号?