我是Java的初学者,我正在使用原始数字类型,当我将字符串解析为字节时,我无法处理生成的字节变量(我的平方它返回错误"类型不匹配:无法从int转换为字节。"
static byte squareByte(String p1){
//parse String to byte
byte result = Byte.parseByte(p1);
//return type byte
return result * result;
}
我使用了" System.out.println(((Object)result).getClass()。getName());"在解析为byte之后确定变量类型,并打印出它是byte,那么为什么我得到一个关于结果为int的错误?
我发现我必须parseByte然后为了乘法才能使Byte工作,有人可以解释为什么我有Byte和Short这个问题,但没有任何其他原始数字类型?
答案 0 :(得分:1)
默认情况下,*
运算符返回int
。如果您想要其他类型,例如byte
,则必须进行投射,但风险可能会超出类型。
return (byte) (result * result);
想想如果乘法超过127
的值,即字节限制会发生什么?
答案 1 :(得分:0)
这是因为JLS指定乘法/加法等数学运算必须返回int
您必须使用 - return (byte) (result * result);
将整数结果显式转换为byte。
答案 2 :(得分:0)
当您使用小于+,-,*,/ or %
的基本类型执行任何算术运算(即int
)时,在算术完成之前将值隐式转换为int。这意味着byte * byte
的结果将是int
,而不是byte
,如您所料。
您可以看到一些进一步的解释和示例here
您可以将操作结果强制转换为byte
以使代码正常工作,但如果计算结果不再适合{{1},您应该考虑要发生什么(例如byte
将适合一个字节,但12
不会)