映射已过滤的元组列表会在scala中产生错误

时间:2014-02-18 11:03:14

标签: scala scala-collections case-class

我使用scala并将案例类定义为

case class caseClass(aString :String, bInt :Int, cClass : Class[_], dClass : Class[_], eClass : Class[_])

然后我有代码从类列表中获取一组M

classes.filter(
  clazz => clazz.isInterface
).map(
    klazz =>  (
      klazz.getDeclaringClass,
      klazz,
      klazz.getDeclaringClass.getDeclaredClasses.filter(
        klass => klass.getSimpleName.equals("PythonJ")
      ).head
      )
  ).zipWithIndex.map { case ((service, iteratr, privte), port) => caseClass(
    s.getName, port, service, iteratr, privte
  )
}.toSet

但是当我尝试编译这段代码时,它会出错

constructor of type (T1, T2, T3) cannot be uniquely instantiated to expected 
type Tuple3 [Class[?], Class[?], Class[?]]

 --- because ---

 undetermined type

 ).zipWithIndex.map { case ((service, iteratr, privte), port) => caseClass(
                             ^

有人可以告诉我要做出正确的事情

2 个答案:

答案 0 :(得分:1)

AurélienThieriot是对的,你需要协助编译器 - 但是在不同的地方:

classes.filter(
  clazz => clazz.isInterface
).map(
    klazz =>  (
      klazz.getDeclaringClass,
      klazz,
      klazz.getDeclaringClass.getDeclaredClasses.filter(
        klass => klass.getSimpleName.equals("PythonJ")
      ).head
      ): (Class[_],Class[_],Class[_]) // <--type spec
  ).zipWithIndex.map { case ((service, iteratr, privte), port) => caseClass(
    service.getName, port, service, iteratr, privte
  )
}.toSet

这将(在我的理解中)帮助将map的结果的类型参数固定到存在类型中,这使得后续类型推断结果明确(即编译器不会被强制推断“{{ 1}} what ?“)。

答案 1 :(得分:0)

我敢打赌,编译器无法推断出类型。

您是否尝试指定了您期望的类型?类似的东西:

).zipWithIndex.map { case ((s: Class[_], i: Class[_], p: Class[_]), port) => Module(