我一直在尝试Scala,试图让SMR在2.9.1的Scala IDE中编译。自2008年左右以来,SMR似乎没有受到影响,并且有许多未解决的编译错误。我卡住的是这一行:
jobConf.setMapRunnerClass(classOf[ClosureMapper[_,_,_,_]]);
ClosureMapper定义如下:
class ClosureMapper[K1,V1,K2,V2] extends MapRunnable[Writable,Writable,Writable,Writable] {
...
}
得到的错误是:
type mismatch;
found : java.lang.Class[smr.hadoop.ClosureMapper[_, _, _, _]](classOf[smr.hadoop.ClosureMapper])
required: java.lang.Class[_ <: org.apache.hadoop.mapred.MapRunnable]
所以在我看来,JobConf类的setMapRunnerClass方法约束了从MapRunnable继承的类型参数(ClosureMapper这样做),但更具体地说,MapRunnable的raw类型,Scala似乎不欣赏。
我尝试了以下操作,但得到了不同的错误:
jobConf.setMapRunnerClass(classOf[ClosureMapper]);
这个给出了class ClosureMapper takes type parameters
关于如何让Scala识别原始类型约束有什么想法吗?
您可能必须为ClosureMapper
的类型参数指定一个界限:
jobConf.setMapRunnerClass(classOf[ClosureMapper[_ <: ClosureMapper[_],_ <: ClosureMapper[_],_ <: ClosureMapper[_],_ <: ClosureMapper[_]]]);