如果是Java方法';s的返回类型为int,该方法能否返回byte类型的值?
我正在读一本名为《Java SE 7程序员考试》(JavaSE7 Programmer I test())的书,为自己的考试做准备。尽管作者有12年的Java编程经验,而且可能是靠薪水进行技术校对,但这本书还是有很多缺陷 但有一件事让我感到不安全。作者在第168页说,这句话是正确的: 如果方法的返回类型为如果是Java方法';s的返回类型为int,该方法能否返回byte类型的值?,java,methods,return-value,return-type,Java,Methods,Return Value,Return Type,我正在读一本名为《Java SE 7程序员考试》(JavaSE7 Programmer I test())的书,为自己的考试做准备。尽管作者有12年的Java编程经验,而且可能是靠薪水进行技术校对,但这本书还是有很多缺陷 但有一件事让我感到不安全。作者在第168页说,这句话是正确的: 如果方法的返回类型为int,则该方法可以返回值 类型为字节 我的观点不同,需要你的帮助。以这段代码为例: public static void main(String[] args) { // This l
int
,则该方法可以返回值
类型为字节
我的观点不同,需要你的帮助。以这段代码为例:
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而不会丢失精度。但是返回的值是,并且将始终是一个整数!还是我错了?你会在考试中回答什么
我不完全确定实际的返回类型是什么,因为书中的这句话据说是真的。转换是在我们的方法实现结束时发生的,还是在赋值之前在主方法中发生的
在现实世界中,只要理解隐式铸造和精度损失的风险,这个问题就无关紧要。但由于这只是考试中可能出现的问题之一,我很想知道这个问题的技术正确答案
澄清
大多数答案似乎认为我想知道是否可以将字节
转换为整数
,然后会发生什么。这不是问题所在。我在问返回的类型是什么。换句话说,作者引用的陈述是对还是错?int的转换是在returnByte()方法实际返回之前还是之后发生的?如果这是真正的考试,你会得到这个问题,你会回答什么
请参见我的代码片段中的第1行。如果作者所说的是正确的,那么这一行将被编译为返回值是一个字节。但是它不能编译,类型提升规则说,如果我们试图将一个int压缩成一个字节,我们就有失去精度的风险。对我来说,这证明了返回值是一个整数。我很确定这与执行
myInt相同。是的,您可以这样做
byte
表达式的值在返回之前将提升为int
- 实际返回类型在方法签名-
int
中声明
依我看,那本书的作者写的或多或少是正确的。他只是没有解释当你“返回一个字节”时,在return
语句中发生的字节到整数的提升
转换是在我们的方法实现结束时发生的,还是在赋值之前在主方法中发生的
强制转换(升级)发生在returnByte
方法中
在现实世界中,只要理解隐式铸造和精度损失的风险,这个问题就无关紧要
将字节
提升为整数
不会降低精度。如果类型不同,可能会有精度损失,但是(假设)无论在哪里执行升级,精度损失都是相同的
JLS中处理此问题的部分是JLS14.17,它指出返回
表达式必须可分配给方法声明的返回类型。它没有显式地声明提升是在方法中完成的,但它是隐含的。此外,这是实现这一目标的唯一实际途径
如果(假设)转换是在调用方法中完成的(例如,main
),则:
- 编译器需要知道
return
语句在做什么。这是不可能的,因为Java类可以单独编译
- 编译器需要知道将调用哪个实际方法。如果该方法被重写,则这是不可能的
- 如果该方法包含两个(或更多)带有不同类型表达式的
return
语句,那么编译器需要知道将执行哪个return
。这是不可能的
如果这是真正的考试,你会得到这个问题,你会回答什么
我会回答。。。“这要看情况”。。。接着是另一种观点
从技术上讲,该方法返回一个int
,但是return
语句可以接受任何类型可以转换为int
的表达式
但是如果有人告诉我这个方法返回的是一个字节
,我会理解他们的意思
此外,据我所知,方法/函数使用堆栈进行存储。等等,在这些堆栈中,它们存储返回地址,而不是返回的对象(类型)。因此,歧义再次出现(至少对我而言)。如果我错了,请纠正我
是的,从技术上讲,方法不返回类型。(即使它返回一个类型
对象也不行。这是一个表示类型的对象,而不是类型本身。)但每个人和他的狗都会高兴地说“returnByte方法返回int类型”
所以,如果你要学究气,那么是的,这是不明确的。但解决办法是不要学究气。是的,这句话是有效的。一个字节
将始终适合int
格式
byte => int //no precision loss
int => byte //precision loss
但如果你正在做:
byte => int => byte //you won't lose any data
这就是你正在做的。这有用吗?你可能想得太多了