Scala:从if-else获取Any而不是List

时间:2018-03-08 14:52:26

标签: scala

以下代码段在' fields.size':"值大小不是Any"的成员。为什么'字段'不属于'列表' (正如我所料)?

val condition = "a"
val fields =
    if (condition == "a") {
      List(1,2)
    } else if (condition == "b") {
      List(1,2,3)
    } else if (condition == "c") {
      List(1,2,3,4)
    }

  var g = 1
  while (g < fields.size) {
    //do something
    g = g + 1
  }

3 个答案:

答案 0 :(得分:7)

嗯,即使“a”的if条件始终为真,也需要默认值

我建议

val fields = condition match {
    case "a" => List(1,2)
    case "b" => List(1,2,3)
    case "c" => List(1,2,3,4)
    case _ => List.empty[Int]
}

如果您需要,您甚至可以定义fields的类型以获得额外的安全性

答案 1 :(得分:2)

考虑一下:如果condition等于&#34; a&#34;,&#34; b&#34;或&#34; c&#34;?那么,没有一个分支会执行,因此不能说fields类型为List

Runnable ScalaFiddle:https://scalafiddle.io/sf/SF4jFcK/0(下面的代码):

val condition = "a"
val fields =
    if (condition == "a") {
      List(1,2)
    } else if (condition == "b") {
      List(1,2,3)
    } else if (condition == "c") {
      List(1,2,3,4)
    } else {
      List()
    }

  var g = 1
  while (g < fields.size) {
    //do something
    g = g + 1
  }

println(g)

答案 2 :(得分:2)

当所有 if表达式失败时,

Scala编译器找不到匹配的大小写。因此,对于该情况,返回Any类型

有效表格是

val fields =
  if (condition == "a") {
    List(1,2)
  } else if (condition == "b") {
    List(1,2,3)
  } else if (condition == "c") {
    List(1,2,3,4)
  }else{
    List.empty[Int]
  }