java - 如果一个Java方法的返回类型是int,那么这个方法可以返回一个byte类型的值吗?

标签 java methods return-value return-type

我正在阅读一本名为 1Z0-803 的书,为 Java SE 7 程序员 I 考试 (OCA Java SE 7 Programmer I Certification Guide) 做准备。 .尽管作者有 12 年的 Java 编程经验并且有技术校对员(大概是领薪水),但这本书还是有很多缺陷。

不过有一件事让我没有安全感。作者在第 168 页说这个陈述是正确的:

If the return type of a method is int, the method can return a value of type 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 以及我们在方法实现结束时实际返回的内容:一个字节。 byte 使用的位 (8) 比 int (32) 少,并且将被转换为 int 而没有精度损失的风险。但是返回值并且永远是一个整数!还是我错了?你会在考试中回答什么?

我不完全确定实际的返回类型是什么,因为书中的这个陈述据说是正确的。 转换是在我们的方法实现结束时发生,还是在赋值之前发生在 main 方法中?

在现实世界中,只要了解隐式转换和丢失精度的风险,这个问题就无关紧要。但由于这只是考试中可能会弹出的问题之一,我很想知道该问题的技术正确答案。

澄清!

大多数答案似乎认为我想知道是否可以将 byte 转换为 int 以及然后会发生什么。好吧,这不是问题。我在问返回的 type 是什么。换句话说,作者引用的陈述对还是错?转换为 int 是发生在 returnByte() 方法实际返回的之前还是之后?如果这是真正的考试,你会得到这个问题,你会回答什么?

请查看我的代码片段中的第 1 行。如果作者所说的是正确的,那么该行将被编译为返回值将是一个字节。但它不编译,类型提升的规则说如果我们试图将一个 int 压缩成一个字节,我们就有失去精度的风险。对我来说,这证明返回值是一个整数。

最佳答案

是的,你可以做到。

  • byte 表达式的值在返回之前将被提升为 int

  • 实际的返回类型在方法签名中声明 - int

IMO,那本书的作者写的或多或少是正确的。当您“返回一个字节”时,他只是没有解释有关 return 语句中字节到整数提升的部分。

Is the cast happening at the end of our method implementation or is the cast happening back in the main method just before assignment?

转换(提升)发生在 returnByte 方法中。

In the real world, this question would not matter as long as one understand the implicit casting and the risk of losing precision.

byte 提升为 int 不会损失精度。如果类型不同,可能会出现精度损失,但(假设)无论在何处执行提升,精度损失都是相同的。


处理此问题的 JLS 部分是 JLS 14.17,其中规定 return 表达式必须可分配到方法声明的返回类型。它没有明确声明提升是在方法中完成的,但它是隐含的。此外,这是实现这一点的唯一实用方法。

如果(假设)转换是在调用方法(例如main)中完成的,那么:

  • 编译器需要知道return 语句在做什么。这是不可能的,因为 Java 类可以单独编译。
  • 编译器需要知道将调用哪个实际方法。如果方法被覆盖,这是不可能的。
  • 如果方法包含两个(或多个)return 语句,其表达式具有不同类型,那么编译器需要知道将执行哪个return。这是不可能的。

If this was the real exam and you would have got the question, what would you have answered?

我会回答......“这取决于”......然后继续其他观点。

从技术上讲,该方法返回一个 int,但 return 语句可以采用任何类型可以转换为 int 的表达式。

但如果有人对我说该方法返回一个字节,我就会明白他们的意思。


Also, as far as i know methods/function use stacks for storage.etc and inside those stacks they store the return addresses not what (type) they are returning to. So, again the ambiguity arises (at least for me). Please correct me if I am wrong.

是的,从技术上讲,方法不返回类型。 (即使它返回一个 Type 对象也不行。这是一个表示类型的对象,而不是类型本身。)但是每个人和他的狗都会高兴地说“returnByte方法返回类型 int”。

所以,如果你要迂腐,那么是的,它是模棱两可的。但解决办法是不要学究气。

关于java - 如果一个Java方法的返回类型是int,那么这个方法可以返回一个byte类型的值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18287786/

相关文章:

java - 如何使用 Tomcat 加载我的自定义 session ID 生成器

class - 我可以在 Scala 类中定义无名方法吗?

python - 是否可以确定函数是哪个类的方法?

c++ - 如果我要用它构造一个对象,我应该 move 被调用者的返回值吗?

javascript - 联系表格和 IE8 问题 - 似乎无法停止提交表格

java - 未为 Atmosphere servlet 调用 Tomcat 过滤器

java - JPA:@OneToMany(fetch = FetchType.EAGER)、分页和重复

java - 在 IntelliJ 中构建项目时获取 "java: package com.sun.javadoc does not exist"

java - 如何使用递归编写链表的 contains 方法? java

function - 从函数、子函数或类型返回多个值?