给定以下 Scala 代码:

val mapAll= Map("A"-> 1.toShort, "B"-> 2.toShort)
val map1 = Map("A"-> 1.toShort)
val map2 = mapAll.map(x => (x._2, map1.getOrElse(x._1, -1.toShort)))

在这种情况下,IDEA 中显示的 map2 类型为 Map[Short, Int]。
我需要的是 Map[Short, Short]

但是,如果像这样将 -1 放入“()”中”
val map2 = mapAll.map(x => (x._2, map1.getOrElse(x._1, (-1).toShort)))

没关系。 IDEA中显示的map2类型是Map[Short, Short]

那么, "(-1).toShort"和 "-1.toShort"有什么区别

最佳答案

没有区别。在这种情况下,您可能被 IntelliJ 的错误类型推断所欺骗。您可以在使用 -Xprint:typer 标志编译 scalac 时看到这一点:

val map2: scala.collection.immutable.Map[Short,Short] =
  mapAll.map[(Short, Short), scala.collection.immutable.Map[Short,Short]](
    ((x: (String, Short)) => scala.Tuple2.apply[Short, Short](
       x._2, map1.getOrElse[Short](x._1, -1.toShort))))
      (immutable.this.Map.canBuildFrom[Short, Short]);

我们还可以通过简化示例来验证这一点:
val shortOne = -1.toShort
val shortTwo = (-1).toShort

并使用 -Xprint:jvm 进行编译以查看最终发出的步骤:
val shortOne: Short = -1.toShort();
val shortTwo: Short = -1.toShort();

你可以看到两者是相同的。

10-08 02:06