2017-03-03 60 views
2
object Main { 
    val list = List[Long]() 
    val map1 = Map[Long, List[Long]]() 
    val map2 = Map[Long, Long]() 

    def main(args: Array[String]): Unit = { 
    for { 
     a: Long <- list 
     b: List[Long] <- map1.get(a) 
     c: Long <- b 
     d: Long <- map2.get(c) 
    } yield d 
    } 
} 

a,b,c,d的类型已被声明只是为了便于分析代码。斯卡拉循环意外编译错误

然后我得到了意外的编译错误:

Error:(10, 15) type mismatch; 
found : List[Long] 
required: Option[?] 
     c: Long <- b 

类型的b是一个列表,我觉得c应该指的是在列表b

为什么编译器预计b应该是每个项目选择什么?

回答

0

问题是你正在混合选项和列表。如果您将您的选项列表它的工作原理:

b: List[Long] <- map1.get(a).toList 

请记住,对于修真仅仅是flatMap语法糖。这实际上是对map1.get(a)结果进行flatMap

b: List[Long] <- map1.get(a) 
    c: Long <- b 

其预计的选项结果。为避免混淆,您应该始终使用与之前相同的类型,即List

另一种选择是跳过b完全和直接压平所述第一地图的结果:

a: Long <- list 
c: Long <- map1.get(a).toList.flatten 
d: Long <- map2.get(c)