Java设置短整型数值

152

我正在使用J2ME编写一些代码。我有一个类,其中包含一个方法setTableId(Short tableId)。现在当我尝试写setTableId(100)时,它会给出编译时错误。如何设置短整型的值而不声明另一个短整型变量?

当设置Long值时,我可以使用setLongValue(100L)并且它有效。那么这里的L是什么意思,Short值的字符是什么?

谢谢


L只是用来表示long字面量的后缀。 - missingfaktor
4个回答

237

在Java中,默认情况下,整数字面量的类型是int。对于其他一些类型,您可以在字面量后缀加上不区分大小写的字母,如LDF,以分别指定为long、double或float。请注意,为了更好的可读性,使用大写字母是常见做法。

Java语言规范没有为byte或short类型提供相同的语法糖。相反,您可以使用显式转换来声明它:

byte foo = (byte)0;
short bar = (short)0;

在你的setLongValue(100L)方法调用中,你不一定需要包含L后缀,因为在这种情况下,整数字面量会自动扩展为长整型。这被称为Java语言规范中的原始类型转换。


20
还有其他类型的后缀:d/D 表示 doublef/F 表示浮点数! - Joachim Sauer
7
另外,符合尺寸要求的字面值无需进行强制类型转换:你的两个示例在没有强制类型转换的情况下同样有效。 - Joachim Sauer
你说得对。我应该更清楚地表明我在这里谈论的是整数字面量,而不是浮点字面量。 - Lauri
4
仅适用于J5+,无需进行强制类型转换;不幸的是,J2ME仍停留在J4(一个严重简化的J4)。 - Lawrence Dol
3
@JoachimSauer,“fit into the size”是什么意思?我问这个问题是因为我刚刚不得不将0明确地转换为(short)0来解决“possible lossy conversion from int to short”错误,尽管0本来就是short类型。 - ryvantage
@ryvantage Java 版本是多少? - Koray Tugay

41

没有字节或短整型文字。你需要使用(short)100进行强制类型转换到 short。


23

通常情况下,您可以将变量强制转换为short类型。

您也可能会遇到类似这样令人困惑的问题。这是因为+运算符会将它们提升为int类型。

enter image description here

强制转换元素不起作用:

enter image description here

您需要强制转换表达式:

enter image description here


2
不要忘记,短整型加短整型等于整型是有原因的。如果两个短整型的和超过了机器的最大短整型值,将其转换为短整型将会产生意想不到的结果或抛出异常(如果语言支持)。 - DGoiko
21
用这个逻辑来说,将两个整数相加会返回一个长整型 ;) - matt burns
1
我正在寻找的是,如果我的总和可以超过Integer.MAX_VALUE。我并不是在为返回int的决定辩护(这可能与硬件实际执行的求和方式有关),我只是说人们应该确认结果是否真正填充了一个short,然后再将其放在那里。我遇到的错误更多地是限制了short容量而不是int,可能是由于涉及的数字大小。Java为short cap保留了2个微小的字节,因此上限非常快。 - DGoiko
1
我再次阅读了我的评论,发现自己表达不够清晰。第一句话很令人困惑,我本应该只留下后面的内容,这样看起来就像是两个相关的陈述。short + short 被定义为 int 的原因可以在这里找到:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.11.1,在 JVM 中没有 short 的求和运算。Java 的 int 是 32 位的,当做出这些决策时,大多数计算机都是 32 位的,所以 int 看起来是最好的选择,我想。 - DGoiko
1
还要注意的是,如https://dev59.com/LV4d5IYBdhLWcg3wJvsp#27123302所解释的那样,JVM实际上为每个类字段至少提供了32位的虚拟内存空间,因此声明短字段根本不会节省内存。 我不知道Java是否改变了这一点。 除非涉及到外部限制(例如DAO),我通常不使用短值。 - DGoiko

10
您可以使用setTableId((short)100)。我认为这在Java 5中已更改,以便将数字字面值分配给目标类型的字节或短整型,并且在目标范围内自动假定是目标类型。最新的J2ME JVM源自Java 4。

欢迎来到编写J2ME代码的中世纪痛苦时期。迫不及待地希望手持设备能够赶上2000年的桌面电脑。 - Lawrence Dol
3
没有“J4”(也没有“J5”)。请不要让Java的版本命名方案更加混乱,让内容更加易懂。 - Joachim Sauer
2
@Joachim:Java 1、Java 2、Java 5、Java 6和Java 7都是众所周知的,因此它们被称为Java 3和Java 4也不太困难。 "Jn"只是显而易见的缩写。采用Sun当前(并希望是最终)的命名法可以减少混淆。 - Lawrence Dol
那么请告诉我,“Java 2”确切的版本是什么? - Joachim Sauer
2
@Joachim:根据Sun公司对此问题的最后一句话,Java“1.x”中的前导“1.”在讨论版本时应被视为不存在,并且仅为了兼容性而被JVM保留在版本中。因此,Java 2是先前称为1.2的版本,从那里J2SE最初出现(您会注意到,同时Sun建议不再使用J2xE,而是使用JavaEE、JavaSE和JavaME)。由此可见,1.3是Java 3,1.4是Java 4,1.5是Java 5,1.6是Java 6,1.7是Java 7。说真的,这并不难理解。 - Lawrence Dol
2
“1.” 只在 Java 5 及以后版本中被删除。Java 1.0-1.4 总是被 Sun 称为这个名称。这是有意为之的,因为 Sun 使用“Java 2”来指代 Java 1.2 到 Java 1.5/Java 5。这非常令人困惑,但是发明从未被 Sun 使用过的新名称并不能使它变得更容易。 - Joachim Sauer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接