【发布时间】:2012-06-14 01:42:37
【问题描述】:
给定以下 scala 代码:
var short: Short = 0
short += 1 // error: type mismatch
short += short // error: type mismatch
short += 1.toByte // error: type mismatch
我不质疑潜在的类型 - 很明显,“Short + value == Int”。
我的问题是:
1.有没有什么办法可以使用操作符?
2. 如果不是,那为什么运算符可以在 Short & Byte 上使用?
[以及扩展名 *=、|= &= 等]
【问题讨论】:
-
其实 Short 没有方法 "+=" 或 "*=" ,你可以看一下 Short scala-lang.org/api/current/index.html#scala.Short 的文档。 x someoperator=y 由编译器自动转换为 x = x someoperator y。
-
@Eastsun 但是 Int 也不是 :-)
a op= b是扩展形式的语法糖:a = a op b,它解释了类型错误(Short + Short -> Int)。它没有解释为什么做出这个决定或者这个结构可能 - 或可能不 - 有什么用途。 (在 C# 中,使用byte+=1而不是byte=byte+1是完全合法的,并且行为在标准中是特定的——在 C# 中隐式转换回 LHS 类型。 -
@pst 是的,你可以在 Java 中和在 C# 中做同样的事情(如果我没记错的话。)
-
@Eastsun 天哪,我试着忘记那种语言;-) 我想有两种使它有用的方法是:1) 隐式强制转换/强制返回到 LFS (ala C#) 或 2) 使 Short + 短 -> 短;第一个只是没有根据 SLS 指定,所以这就留下了关于添加的类型提升的争论......(也许后者是为了处理 Java 类型提升?或者只是溢出错误?或者......)跨度>