[英]If a Java method's return type is int, can the method return a value of type byte?
我正在通过阅读一本名为OCA Java SE 7 Programmer I认证指南的书来为Java SE 7程序员I考试( 1Z0-803 )做准备。 尽管作者在Java编程方面有12年的经验,并且尽管有技术校对员,但可能是薪水,但本书中存在大量的缺陷。
有一件事让我不安全。 作者在第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,以及我们在方法实现结束时实际返回的内容:一个字节。 该字节比int(32)使用更少的位(8),并且将被转换为int而不存在精度损失的风险。 但返回的值是,并且将始终是一个整数! 还是我错了? 你在考试中会得到什么回答?
我不完全确定实际的返回类型是什么,因为书中的这句话被认为是真的。 演员是否在我们的方法实现结束时发生,或者是在赋值之前在main方法中发生的演员?
在现实世界中,只要理解隐式铸造和失去精度的风险,这个问题就不重要了。 但由于这只是考试中可能出现的问题之一,我很想知道问题的技术上正确的答案。
大多数答案似乎都认为我想知道是否可以将一个byte
转换为int
,然后会发生什么。 嗯,这不是问题。 我问的是返回的类型是什么。 换句话说,作者的引用陈述是对还是错 ? 转换为int是否发生在 returnByte()方法实际返回之前或之后 ? 如果这是真正的考试,你会有问题,你会回答什么?
请参阅我的代码段中的第1行。 如果作者说的是对的,该行将被编译,因为返回的值将是一个字节。 但是它没有编译,类型提升的规则说如果我们试图将int压缩到一个字节中,我们就会冒失去精度的风险。 对我来说,这证明了返回的值是一个整数。
是的,你可以这么做。
在返回之前, byte
表达式的值将被提升为int
。
实际的返回类型是在方法签名 - int
声明的。
国际海事组织,这本书的作者写的或多或少是正确的。 当你“返回一个字节”时,他只是在解释有关return
语句中发生的字节到字的提升的问题。
演员是否在我们的方法实现结束时发生,或者是在赋值之前在main方法中发生的演员?
returnByte
(促销)发生在returnByte
方法中。
在现实世界中,只要理解隐式铸造和失去精度的风险,这个问题就不重要了。
将byte
提升为int
不会有精度损失。 如果类型不同,可能会失去精确度,但(假设)精确度的损失在执行促销的任何地方都是相同的。
处理此问题的JLS部分是JLS 14.17,它表示return
表达式必须可分配给方法声明的返回类型。 它没有明确声明促销是在方法中完成的,但它是隐含的。 此外,它是实现这一目标的唯一实用方法。
如果(假设)转换是在调用方法(例如main
)中完成的,那么:
return
语句正在做什么。 考虑到Java类可以单独编译,这是不可能的。 return
语句,则编译器需要知道将执行哪个return
。 这是不可能的。 如果这是真正的考试,你会有问题,你会回答什么?
我会回答......“这取决于......”并继续进行另类观点。
从技术上讲,该方法返回一个int
,但return
语句可以采用任何类型可以转换为int
表达式。
但如果有人对我说这个方法返回一个byte
,我就会理解它们的含义。
另外,据我所知,方法/函数使用stack.etc的堆栈,在这些堆栈中,它们存储的返回地址不是它们返回的(类型)。 所以,再次出现歧义(至少对我而言)。 如果我错了,请纠正我。
是的,从技术上讲,方法不会返回类型。 (即使它返回一个Type
对象也没有。这是一个表示类型的对象,而不是类型本身。)但是每个人和他的狗都会高兴地说“returnByte方法返回类型int”。
所以,如果你要迂腐,那么是的,它是模棱两可的。 但解决方案是不要迂腐。
我很确定它与执行myInt << 24
相同,得到最后的8位,因此如果整数超过255(2 ^ 8),则即将失去精度。
是的,该声明是有效的。 一个byte
总是很容易适合int
。
byte => int //no precision loss
int => byte //precision loss
但如果你这样做:
byte => int => byte //you won't lose any data
这是你在做什么。 这有帮助吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.