最近我在一个项目中看到了很多类似的代码块,它们按以下方式编写:
String usedAlphabet = "x3w4tnu34urgbgierg";
byte c = // (something initialized earlier)
return usedAlphabet[(int)(c / 16)];
现在,访问相应数组时使用(int)
强制转换的原因可能是什么?
对我而言,这似乎是多余的,但我可能错了,或者我可能缺乏关于类型铸造机制的知识。
答案 0 :(得分:6)
答案 1 :(得分:5)
你是对的 - 除法是整数除法,它总是会得到一个整数,因此不需要强制转换。
但是,c
本身缺少上下文(特别是如果没有定义接近此用法),因为这可能不是显而易见的byte / int
。可能会添加演员作为可读性辅助工具。
答案 2 :(得分:2)
由于c
是byte
且16
是int
,因此除法的结果是int
,这使得转换成为冗余。但是,c
的声明在某一时刻可能是long
或double
,并且需要演员。当声明被更改时,演员表从未被删除。
答案 3 :(得分:1)
我猜测来自开发人员的演员不清楚该语言的打字规则,因此采用了“更安全而不是抱歉”的方法。我怀疑我们大多数人在某些时候已经这样做了。话虽如此 - 演员阵容是不必要的,甚至没有澄清。
答案 4 :(得分:1)
正如您已经发现的那样,演员表是多余的。它有助于提高可读性吗?也许,取决于具体情况。可以做些什么真的有助于这种“不明显的数组索引”的可读性?好的名字我告诉你(当然,作者应该找到传达他意图的正确的名称,我刚刚在这里做了):
int sectionSize = 16;
String usedAlphabet = "x3w4tnu34urgbgierg";
byte sectionIndex = // (something initialized earlier)
int alphabetIndex = sectionIndex / sectionSize;
return usedAlphabet[alphabetIndex]; // not so puzzling anymore