为什么'ints'不会在scala中投入'longs'

时间:2013-10-24 09:12:56

标签: scala map int long-integer type-inference

为什么我需要在Map中的每个键后面写'L'以获得Map [Long,...]?还有另一种不那么冗长的方式吗?

private[this] val periodById: Map[Long, X] = Map(
    1L -> OneSecond,
    4L -> TenSecond,
    5L -> ThirtySecond,
    10L -> OneMinute,
    50L -> FiveMinutes,
    100L -> TenMinutes
)

1 个答案:

答案 0 :(得分:3)

因为你需要两个暗示。以下内容:

某事 - > to somethingElse

语法隐式转换为一对。 Int to long是另一个编译时隐式转换

private[this] val periodById: Map[Long, X] = Map(
  (1, OneSecond),
  (4, TenSecond)
)

应该有效。工作表给出了:

val m: Map[Long, Int] = Map((4, 5), (3, 2))
//> m  : Map[Long,Int] = Map(4 -> 5, 3 -> 2)
//My note the Worksheet is using Tuple2's to String method to display the x -> y notation.
m.getClass.getName
//> res1: String = scala.collection.immutable.Map$Map2
m.head.getClass.getName
//> res1: String = scala.Tuple2

作为一个简单的一般规则,Scala一次只允许一次隐式转换。如果它没有完成疯狂会随之而来,所有编译时类型安全都将丢失。

如果你发现你必须经常编写这个语法,你可以创建一个简单的工厂方法来从Int转换为Longs。如果它的性能至关重要,那么你可以写一个宏来转换。