我一直在玩 Scala,试图让 SMR 在带有 2.9.1 的 Scala IDE 中编译。自 2008 年以来,SMR 似乎没有受到影响,并且有很多 Unresolved 编译错误。我陷入困境的是这一行:

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 的原始类型,Scala 似乎并不欣赏它。

我尝试了以下操作,但遇到了不同的错误:
jobConf.setMapRunnerClass(classOf[ClosureMapper]);

那个给出了 class ClosureMapper takes type parameters
关于如何让 Scala 识别原始类型约束的任何想法?

最佳答案

您可能必须为 ClosureMapper 的类型参数指定一个界限:

jobConf.setMapRunnerClass(classOf[ClosureMapper[_ <: ClosureMapper[_],_ <: ClosureMapper[_],_ <: ClosureMapper[_],_ <: ClosureMapper[_]]]);

关于generics - 引用具有原始类型约束的基本类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7411481/

10-10 17:00
查看更多