类型转换与文本赋值

2022-09-03 17:21:55

请考虑以下事项:

class TypeCast {
    public static void main(String[] args) {
        byte by = 4;   // Compiler casts int literal to byte
        int in = 4;
        byte byt = in; // Compilation Error: compiler can not cast automatically. WHY?
    }
}

我知道编译器可以在文字分配的情况下进行缩小。但是,当赋值涉及变量而不是文字时,它不能做同样的事情。为什么?

编辑:我想大多数人都无法理解我想问什么。它不是关于分配“超出范围”的值,而是关于分配“范围内”值,并让编译器处理缩小。很明显,“字节”将无法处理超出范围的值,并且需要显式转换(这不是我想知道的)。byte

给定值在范围内,文本赋值到 和类型变量赋值有什么区别?byteintbyteintbyte


答案 1

因为在代码中,您可以更改变量的值。这就是为什么不允许将int变量分配给字节的原因,但是如果您将int变量声明为final,它将允许尝试以下操作:

 public class Test {
    public static void main(String[] args) {
       final int i = 10;
       byte by = i;
    }
 }

这意味着10在字节范围内,所以一切都很好,但如果你写

public class Test {
   public static void main(String[] args) {
      final int i = 10000;
      byte by = i;
   }
 }

它会给你一个错误,因为10000不在字节的范围内。


答案 2

恕我直言,主要原因是像这样的代码(实际上无法编译)

  int in = ...   // what if in == 1234?;
  byte byt = in; // then byt == -46. Can you expect this?

危险的,因为潜在的溢出(int变成字节)。然而1234-46

  byte byt = 4; 

安全的,因为非法(溢出)代码像

  byte byt = 1234; // doesn't compile   

将导致编译时错误。但是,您可以坚持

  // I'm warned about the overflow, but do as I command...
  byte byt = (byte) 1234; // -46

  int in = ...
  byte byt = (byte) in; // I know what I'm doing! Cast it, please 

推荐