SSCCE:
public class Test {
public static void main(String[] args) {
Long a = new Long(1L);
new A(a);
}
static class A {
A(int i) {
System.out.println("int");
}
A(double d) {
System.out.println("double");
}
}
}
输出:
double
打印时不会出现编译错误,它可以正常工作并调用double
- 参数构造函数。但为什么?
答案 0 :(得分:8)
这取决于类型宣传的规则:long
优先转换为double
,而不是int
。
如果long
大于double
,long
可以永远适合double
,,但精度可能会丢失因此,你的编译器选择int
构造函数比1L
构造函数更合适。
(编译器不会在int
适合 ....
do {
QSqlQuery query(db);
query.prepare("select * from Person where chatID=:chatID");
query.bindValue(":chatID",chatID);
if(query.exec())
break;
} while (0);
db.close();
....
QSqlDatabase::removeDatabase(databaseName);
的意义上进行动态检查。< / p>
答案 1 :(得分:1)
因为long不适合int。
检查https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html
答案 2 :(得分:1)
int
为4个字节,其中long
和double
为8个字节
因此,很明显,如果将数据转换为int,则有可能丢失4个字节的数据。数据类型始终是上传的。正如@Bathsheba提到的评论所述,即使使用double,也有可能丢失数据,但与int相比,损失要小得多。
如您所见,double使用52位来存储有效数字。如果它选择int,变量将有32位可用。因此jvm选择double而不是int。
来源:Wikipedia
答案 3 :(得分:1)
将# np.concatenate((self._bm_lons,self._bm_lons+360),1)
np.concatenate((self._bm_lons,self._bm_lons+360))
转换为long
是narrowing primitive conversion,因为它可能会失去该值的整体幅度。将int
转换为long
是widening primitive conversion。
编译器将自动为参数生成assignment context转换。这包括扩大原始转换,但不缩小原始转换。因为带有double
参数的方法需要缩小转换,所以它不适用于该调用。