我正在阅读一本名为OCA Java SE 7 Programmer I Certification Guide的书,为 Java SE 7 Programmer I 考试 ( 1Z0-803 ) 做准备。尽管作者有 12 年的 Java 编程经验,并且尽管有技术校对员,这本书还是有很多缺陷,大概是拿薪水的。
不过有一件事让我没有安全感。作者在第 168 页上说,这个说法是正确的:
如果一个方法的返回类型是
int
,该方法可以返回一个类型的值byte
。
好吧,我争论不同,需要你的帮助。以这段代码为例:
public static void main(String[] args)
{
// This line won't compile ("possible loss of precision"):
byte line1 = returnByte();
// compiles:
int line2 = returnByte();
// compiles too, we "accept" the risk of precision loss:
byte line3 = (byte) returnByte();
}
public static int returnByte()
{
byte b = 1;
return b;
}
显然,编译器不会抱怨returnByte()
方法签名中的不同返回类型 int 以及我们实际上在方法实现结束时返回的内容:一个字节。该字节使用的位 (8) 比 int (32) 少,并且将被强制转换为 int 而没有精度损失的风险。但是返回的值是并且将永远是一个整数!还是我错了?你会在考试中回答什么?
我不完全确定实际的返回类型是什么,因为据说书中的这个陈述是正确的。强制转换是在我们的方法实现结束时发生的,还是在分配之前发生在主方法中?
在现实世界中,只要了解隐式转换和丢失精度的风险,这个问题就无关紧要了。但由于这只是考试中可能出现的问题之一,我很想知道该问题在技术上的正确答案。
澄清!
大多数答案似乎认为我想知道是否可以将 abyte
转换为 anint
以及随后会发生什么。好吧,这不是问题。我在问返回的类型是什么。换句话说,作者引用的陈述是对还是错?转换为 int 是在returnByte() 方法实际返回之前还是之后发生的?如果这是真正的考试并且你会得到这个问题,你会回答什么?
请参阅我的代码片段中的第 1 行。如果作者说的是对的,那么该行将编译为返回值将是一个字节。但是它不能编译,类型提升的规则说如果我们试图将一个 int 压缩成一个字节,我们就有失去精度的风险。对我来说,这证明了返回的值是一个整数。