(-1).toShort 和 -1.toShort 在Scala中有什么区别?

4

以下是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”有什么区别?


我也是啊 :}} - user2864740
2个回答

6

没有区别。在这种情况下,您可能会被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();

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

2

简而言之,- 的定义如下:def unary_- : Int

在IDEA中,-1.toShort 被理解为类型为 Int-(1.toShort),而 (-1).toShort 则被正确地识别为类型为 Short,因为现在是在 - 之后调用 toShort 方法,而不是在之前。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接