给定以下 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();
你可以看到两者是相同的。