与INT成员的元组不识别出需要长时间的时间



我有一个期望tuple2的函数,其中一个项目必须长。当我尝试使用 ->隐式传递字面数字时,它们被解释为 Int而不是 Long

在此证明了问题:

scala> val x: (Long, String) = (5, "test") 
x: (Long, String) = (5,test)
scala> val x: (Long, String) = 5L -> "test"
x: (Long, String) = (5,test)
scala> val x: (Long, String) = 5 -> "test"
<console>:43: error: type mismatch;
 found   : (Int, String)
 required: (Long, String)
       val x: (Long, String) = 5 -> "test"

我想问题是当应用隐式时,键入Int上的推理锁定,但是在第一个示例中,键入推断足以考虑数字A Long

,如果我可以使用->并省略L后缀,我的DSL效果会更好。有没有办法实现这一目标?

不幸的是,Int不是Long的子类型。因此,尽管Tuple2在其类型参数中是协变量的,但(Int, String)无法通过预期(Long, String)的情况。

但是, Int可查看的作为 Long。因此,您可以设计一个将Int转向Long的函数以下方式:

scala> def goodFunc[LongLike <% Long](arg: (LongLike, String)) = { "whatevs" }
goodFunc: [LongLike](arg: (LongLike, String))(implicit evidence$1: LongLike => Long)String
scala> goodFunc(5 -> "test")
res4: String = whatevs

或更好的是,使用:

def goodFunc[LongLike](arg: (LongLike, String))(implicit ev: LongLike => Long) = { "whatevs" }

,由于 <%被弃用。

最新更新