繁体   English   中英

如果Java方法的返回类型是int,那么该方法是否可以返回byte类型的值?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM