输入强制转换与文字分配

max*_*335 12 java casting

考虑以下:

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?
    }
}
Run Code Online (Sandbox Code Playgroud)

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

编辑:我想大多数人都无法理解我想要问的问题.它不是要分配'超出范围'的值,而是分配'范围内'值byte并让编译器处理缩小范围.很明显,'byte'将无法处理超出范围的值,并且显式转换将需要(并且我不想知道).

给定值落在byte范围内,int文字赋值byteint类型变量赋值之间的区别是什么byte

小智 22

因为在您的代码中,您可以更改变量的值.这就是为什么不允许将int变量赋给一个字节的原因,但是如果你将int变量声明为final,它将允许尝试这样:

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

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

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

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


Dmi*_*nko 7

恕我直言,主要原因是那样的代码(实际上不编译)

  int in = ...   // what if in == 1234?;
  byte byt = in; // then byt == -46. Can you expect this?
Run Code Online (Sandbox Code Playgroud)

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

  byte byt = 4; 
Run Code Online (Sandbox Code Playgroud)

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

  byte byt = 1234; // doesn't compile   
Run Code Online (Sandbox Code Playgroud)

将导致编译时错误.但是你可以坚持:

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

要么

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