Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果是Java方法';s的返回类型为int,该方法能否返回byte类型的值?_Java_Methods_Return Value_Return Type - Fatal编程技术网

如果是Java方法';s的返回类型为int,该方法能否返回byte类型的值?

如果是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

我正在读一本名为《Java SE 7程序员考试》(JavaSE7 Programmer I test())的书,为自己的考试做准备。尽管作者有12年的Java编程经验,而且可能是靠薪水进行技术校对,但这本书还是有很多缺陷

但有一件事让我感到不安全。作者在第168页说,这句话是正确的:

如果方法的返回类型为
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
这就是你正在做的。这有用吗?

你可能想得太多了