我有一个期望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" }
,由于 <%
被弃用。