我最近在Scala中实现二进制网络协议。数据包中的许多字段自然地映射到Scala Shorts。我想简要地增加Short
变量(不是值)。理想情况下,我想要s += 1
(适用于 Ints )。
scala> var s = 0:Short
s: Short = 0
scala> s += 1
<console>:9: error: type mismatch;
found : Int
required: Short
s += 1
^
scala> s = s + 1
<console>:8: error: type mismatch;
found : Int
required: Short
s = s + 1
^
scala> s = (s + 1).toShort
s: Short = 1
scala> s = (s + 1.toShort)
<console>:8: error: type mismatch;
found : Int
required: Short
s = (s + 1.toShort)
^
scala> s = (s + 1.toShort).toShort
s: Short = 2
+=
未定义Short
运算符,因此在添加之前似乎隐式转换s
到Int
。此外,Short
的+运算符返回Int
。
以下是Ints的工作原理:
scala> var i = 0
i: Int = 0
scala> i += 1
scala> i
res2: Int = 1
现在我将使用s = (s + 1).toShort
有什么想法吗?
答案 0 :(得分:7)
您可以定义一个将Int
转换为Short
的隐式方法:
scala> var s: Short = 0
s: Short = 0
scala> implicit def toShort(x: Int): Short = x.toShort
toShort: (x: Int)Short
scala> s = s + 1
s: Short = 1
编译器将使用它来使类型匹配。请注意,虽然implicits也有缺陷,但某些地方你可能会发生转换,甚至不知道原因,只是因为该方法是在范围内导入的,代码可读性也会受到影响。