- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
考虑以下代码片段:
// automatic casting works for int to byte conversion as integer literal 127
// is in the range for byte
byte b1 = 127; //OK
// automatic casting doesn't work for long to int conversion
// even if long literal is in the range of int.
int i5 = 100L; // NOT OK - compilation error
对这种行为有什么解释吗?
为什么 int 到 byte 不需要显式转换,但 long 到 int 需要显式转换?
How does Java convert int into byte?问题是不同的。是关于当int值超出范围时,int隐式转换为byte的问题。
最佳答案
扩大转换(例如 byte
到 int
)通常被 Java 编译器隐式接受,因为没有信息丢失(int
的范围大于 byte
的范围)。
缩小转换范围(例如 long
到 int
,如您的情况)会导致信息丢失,因此通常需要显式转换。
参见 this类似的问题,和this . Java Language Specification 的相关部分:
Assignment conversion occurs when the value of an expression is assigned (§15.26) to a variable: the type of the expression must be converted to the type of the variable.
...
In addition, if the expression is a constant expression (§15.28) of type byte, short, char, or int:
A narrowing primitive conversion may be used if the type of the variable is byte, short, or char, and the value of the constant expression is representable in the type of the variable.
A narrowing primitive conversion followed by a boxing conversion may be used if the type of the variable is:
Byte and the value of the constant expression is representable in the type byte
Short and the value of the constant expression is representable in the type short.
Character and the value of the constant expression is representable in the type char.
(强调我的)
一些混淆源于我们特别处理常量表达式,因为我们使用的是数字文字。上述规范也需要仔细阅读。
清理一些东西并直接回答 OP 的一些查询:
为什么一种类型的缩小支持隐式缩小,而另一种不支持?
即。为什么 byte b1 = 127
隐式工作,而int i5 = 100L
不是吗?
byte b1 = 127
执行隐式转换(参见上面引用中的粗体文本),“常量表达式的值可以用字节类型表示”。即 127
由 byte
表示,所以转换是隐式的。如果你尝试 byte b1 = 128
,您将收到有关不兼容类型的错误,如 128
不能用 byte
表示.我们在这里完全允许隐式转换的唯一原因是因为我们使用的是常量表达式。
我们没有在 int i5 = 100L
中进行隐式转换(即使 100 在 int
的范围内)因为它根本没有在允许的隐式转换中列出(变量的类型 int
不是 byte
、 short
或 char
之一)。
我们也没有在 byte a = 0L
中进行隐式转换, 这次常量表达式的类型是 long
, 不是 byte
类型, short
, char
, 或 int
.
普通程序员如何知道隐式允许哪种收缩转换?
隐式缩小转换仅在您将常量表达式 分配给变量时发生。在这些情况下,隐式转换很好,因为我们不想编写像 byte b = (byte)0
这样的代码。每时每刻。同时,如果我们写类似 byte b = 128
的内容,我们确实希望得到警告。 ,因为它没有直观的行为。
当我们不分配常量表达式时(例如 int x = 0; byte b = x;
),我们总是希望在进行潜在有损转换时得到警告,因为它们很危险 - 因此在这种情况下显式转换也会感觉。
关于java - 为什么允许从 int 到 byte 而不是从 long 到 int 的隐式缩小转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48025164/
我正在尝试使用 y 组合器在 Scala 中定义 gcd: object Main { def y[A,B]( f : (A => B) => A => B ) : A => B = f(y(f)
我正在尝试了解返回指向函数的指针的函数,在我尝试编译代码后,它给了我这种错误: cannot convert int (*(int))(int) to int (*(int))(int) in ass
所以我一直在关注 youtube 上的游戏编程教程,然后弹出了这段代码:bufferedImageObject.getRGB(int, int, int, int, int[], int, int);
我正在将时间现在 与存储在数据库某处的时间进行比较。数据库中存储的时间格式为“yyyyMMddHHmmss”。例如,数据库可能会为存储的时间值返回 201106203354。然后我使用一个函数将时间现
例如 Maze0.bmp (0,0) (319,239) 65 120 Maze0.bmp (0,0) (319,239) 65 120 (254,243,90) Maze0.bmp (0,0) (
评论 Steve Yegge的post关于 server-side Javascript开始讨论语言中类型系统的优点和这个 comment描述: ... examples from H-M style
我正在研究 C 的指针,从 Deitel 的书中我不明白 int(*function)(int,int) 和 int*function(int, int) 表示函数时。 最佳答案 C 中读取类型的经验
您好,我使用 weblogic 11g 创建 war 应用程序,我对 joda time 的方法有疑问 new DateTime(int, int, int, int, int, int); 这抛出了
Create a method called average that calculates the average of the numbers passed as parameters. The
var a11: Int = 0 var a12: Int = 0 var a21: Int = 0 var a22: Int = 0 var valueDeterminant = a11 * a12
我正在为一个项目设置 LED 阵列。我得到了一个 LED 阵列,可以根据引脚变化电压进行更改,但我无法添加更多引脚。 当我尝试时,编译失败并显示错误:函数“int getMode(int, int,
除了创建对列表执行简单操作的函数之外,我对 haskell 还是很陌生。我想创建一个列表,其中包含 Int 类型的内容, 和 Int -> Int -> Int 类型的函数. 这是我尝试过的: dat
这个问题已经有答案了: Java add buttons dynamically as an array [duplicate] (4 个回答) 已关闭 7 年前。 StackOverFlow问题今天
我有几个 EditText View ,我想在其中设置左侧的图像,而 setCompoundDrawablesWithIntrinsicBounds 似乎不起作用。图形似乎没有改变。 有人知道为什么会
#include using namespace std; int main() { static_assert(is_constructible, int(*)(int,int)>::val
fun sum(a: Int, b: Int) = a + b val x = 1.to(2) 我在找: sum.tupled(x),或者 sum(*x) 当然,以上都不能用 Kotlin 1.1.3
有一个函数: func (first: Int) -> Int -> Bool -> String { return ? } 返回值怎么写?我对上面 func 的返回类型感到很困惑。 最
type foo = A of int * int | B of (int * int) int * int 和 (int * int) 有什么区别?我看到的唯一区别在于模式匹配: let test_
我正在尝试制作一个 slider 游戏。在这个类中,我使用 Graphics 对象 g2 的 drawImage 方法来显示“拼图”的 block 。但在绘制类方法中,我收到此错误:找不到符号方法dr
我试着理解这个表达: static Func isOdd = i => (i & 1) == 1; 但是这是什么意思呢? 例如我有 i = 3。然后 (3 & 1) == 1 或 i = 4。然后
我是一名优秀的程序员,十分优秀!