- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
新的 Java 程序员经常对编译错误消息感到困惑,例如:
"incompatible types: possible lossy conversion from double to int"
int squareRoot = Math.sqrt(i);
最佳答案
首先,这是一个编译错误。如果您在运行时在异常消息中看到它,那是因为您运行的程序有编译错误1。
消息的一般形式是这样的:
"incompatible types: possible lossy conversion from
<type1>
to<type2>
"
<type1>
和
<type2>
都是原始数字类型;即
byte
之一,
char
,
short
,
int
,
long
,
float
或
double
.
<type1>
进行隐式转换时会发生此错误至
<type2>
但转换可能是有损的。
int squareRoot = Math.sqrt(i);
sqrt
方法产生一个
double
,但来自
double
的转换至
int
可能有损。
long
的转换到 int
是一个潜在的有损转换,因为有 long
没有对应的值 int
值(value)。例如,任何 long
大于 2^31 - 1 的值太大而无法表示为 int
.同样,任何小于 -2^31 的数字都太小了。int
的转换到 long
不是有损转换,因为每个 int
value 有一个对应的 long
值(value)。float
的转换到 long
是潜在的有损转换,因为存在 float
太大或太小而无法表示为 long
的值值。long
的转换到 float
不是有损转换,因为每个 long
value 有一个对应的 float
值(value)。 (转换后的值可能不太精确,但“损失”并不意味着……在这种情况下。)short
至 byte
或 char
char
至 byte
或 short
int
至 byte
, short
或 char
long
至 byte
, short
, char
或 int
float
至 byte
, short
, char
, int
或 long
double
至 byte
, short
, char
, int
, long
或 float
. int i = 47;
int squareRoot = Math.sqrt(i); // compilation error!
变成
int i = 47;
int squareRoot = (int) Math.sqrt(i); // no compilation error
但这真的是修复吗?考虑
47
的平方根是
6.8556546004
... 但是
squareRoot
将得到值
6
. (转换将截断,而不是舍入。)
byte b = (int) 512;
结果是
b
获取值
0
.从较大的 int 类型转换为较小的 int 类型是通过屏蔽掉
512
的高位和低 8 位来完成的。都是零。
<type1>
是不同的类型,所以这里不需要有损转换? for (double d = 0; d < 10.0; d += 1.0) {
System.out.println(array[d]); // <<-- possible lossy conversion
}
这里的问题是数组索引值必须是
int
.所以
d
必须从
double
转换而来至
int
.通常,使用浮点值作为索引没有意义。要么有人认为 Java 数组的工作方式类似于(比如)Python 字典,要么他们忽略了浮点运算通常不准确的事实。
for (long l = 0; l < 10; l++) {
System.out.println(array[l]); // <<-- possible lossy conversion
}
这是上一个问题的变体,解决方法是一样的。不同之处在于根本原因是 Java 数组仅限于 32 位索引。如果您想要一个具有超过 231 - 1 个元素的“类似数组”的数据结构,您需要定义或找到一个类来完成它。
public class User {
String name;
short age;
int height;
public User(String name, short age, int height) {
this.name = name;
this.age = age;
this.height = height;
}
public static void main(String[] args) {
User user1 = new User("Dan", 20, 190);
}
}
使用 Java 11 编译上面的代码会得到以下结果:
$ javac -Xdiags:verbose User.java
User.java:20: error: constructor User in class User cannot be applied to given types;
User user1 = new User("Dan", 20, 190);
^
required: String,short,int
found: String,int,int
reason: argument mismatch; possible lossy conversion from int to short
1 error
问题在于文字
20
是
int
,并且构造函数中的相应参数声明为
short
.转换
int
到
short
是有损的。
int a = 21;
byte b1 = a; // <<-- possible lossy conversion
byte b2 = 21; // OK
到底是怎么回事?为什么允许一个版本而另一个版本不允许? (毕竟他们“做”同样的事情!)
21
是类型为
int
的数字文字. (没有
byte
或
short
文字。)所以在这两种情况下,我们都分配了一个
int
到
byte
.
int
值将适合
byte
.
21
是一个总是适合
byte
的值.
byte
执行原始收缩转换。 ,
char
或
short
如果以下全部为真:
byte
, short
, char
或 int
. Byte b4 = new Byte(21); // incorrect
给出编译错误。
.class
带有错误的方法如果被调用将抛出未经检查的异常的文件。异常消息将提及编译错误消息。
关于java - "possible lossy conversion"是什么意思,我该如何解决?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51632152/
有没有人有嵌套 Intent 的好例子,尤其是在 #yes 和 #no 是子节点的情况下。我得到的情况是 API 返回的是 Intent 值,但输出文本来自“Anything else”! 最佳答案
我知道您可以转到 Watson Conversation 界面,右键单击工作区,然后下载工作区的 JSON,其中包含意图,如下所示:Is there any way to export intents
我能否在 Watson Conversation API 的对话流中使用节点条件中的意图置信度评级? 最佳答案 要做到这一点,请创建一个条件来寻找您的意图,然后检查置信度。 你会拥有的示例条件 #te
我找到了很多关于这个错误的帖子,但我可以找到克服它的方法。这是触发错误的代码: void main(){ float f{1.3}; } 为什么在初始化列表中没有像其他变量那样发生转换?例如,
我有以下代码。 #include using namespace std; class Base { public: virtual int f(){coutf(); ///base
Visual C++ 2017 和 gcc 5.4 产生 conversion from 'const unsigned char' to 'const float' requires a narro
我正在为 PIC18F2420 使用带有 xc8 1.35 编译器的 MPLABX 3.20,我收到了两个我不理解的奇怪警告: 这是生成警告的源代码之一 9 void write(Pin _Pin,
我正在尝试在 win32 API(无 mfc)上编写一些直接的 c++。有了这个更现代的 c++ 编译器,我得到: 警告 C4838:从“unsigned int”到“int”的转换需要收缩转换 它发
此代码采用用户输入(字符 C、T、B)和(int 0-24 和 0-60)来计算 parking 成本关于用户输入的车辆类型。 我怀疑错误发生在函数 charged 中,因此我无法在收到此错误的最后一
为什么在使用 tuple 或 Tuple 转换向量时会得到以下不同的结果? julia> a = [1, 2, 3] 3-element Vector{Int64}: 1 2 3 julia> tup
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 8年前关闭。 Improve t
我正在开发一个文件共享网站,我需要一种方法来对上传的文档进行截图。 该站点将支持多种文件格式,从纯文本到办公文档(doc、xls、ppt...)、视频(mpeg、avi...)、图像(jpg、gif、
在 VHDL 中是否有将整数类型对象转换为实数类型的通用转换函数? 这是针对测试平台的,因此可综合性不是问题。 最佳答案 您可以将整数转换为实数,如下所示: signal i: integer; si
如何在 Ocaml 中将字符串选项数据类型转换为字符串? let function1 data = match data with None -> "" | Some str -> s
我已经在 VHDL 中编写了一个算法,但是我有一条消息,我不明白“sra/sla 在这种情况下不能有这样的操作数。”。请问有什么帮助吗? library ieee; use ieee.std_logi
我经常需要将数据从一种类型转换为另一种类型,然后进行比较。一些运算符会先转换为特定类型,这种转换可能会导致效率损失。例如,我可能有 my $a, $b = 0, "foo"; # initial va
假设我在 IBM Watson 中配置了一个对话服务,可以识别以单词和片段形式给出的数字。例如,如果我有号码 1320 , 可以发送为 thirteen twenty或 thirteen two ze
也许我错过了一些显而易见的事情...在整个文档中,我似乎都认为Kotlin具有各种类型的序列,这些序列不能互操作。即使复制序列可能效率不高–当我需要将其作为语义相同但不同的类型传递给函数时,这也无济于
在我的Linux终端中,我想要使用QTcpSocket从qt运行以下“对话”: S user@domain:~ $ netcat 1.1.1.2 9230 R HELO SOME MORE I
我有一个模板函数,其中枚举类型转换为它的底层类型,工作正常,但我写了一个重载,它应该接受一个整数并返回它自己,它给我一个错误,指出 int 不是枚举类型。在我的模板中,这应该已经被过滤掉了。怎么了?
我是一名优秀的程序员,十分优秀!