当前位置: 首页 > 知识库问答 >
问题:

“可能的有损转换”是什么意思,我如何修复它?

孙梓
2023-03-14
int squareRoot = Math.sqrt(i);

一般来说,“可能的有损转换”错误消息意味着什么,您如何修复它?

共有1个答案

王英彦
2023-03-14

首先,这是一个编译错误。如果您在运行时的异常消息中看到它,那是因为您运行了一个带有编译错误的程序1

消息的一般形式是这样的:

“不兼容类型:从 的转换可能有损”

  int squareRoot = Math.sqrt(i);

这些都是潜在有损的转换:

  • 字节字符
  • 字符字节
  • int字节字符
  • 字节字符int
  • float字节字符int
  • doublebyteshortcharintlongfloat

使编译错误消失的方法是添加一个类型转换。例如;

  int i = 47;
  int squareRoot = Math.sqrt(i);         // compilation error!
  int i = 47;
  int squareRoot = (int) Math.sqrt(i);   // no compilation error
  byte b = (int) 512;
    null
for (double d = 0; d < 10.0; d += 1.0) {
    System.out.println(array[d]);  // <<-- possible lossy conversion
}

解决方法是重写代码,避免使用浮点值作为数组索引。(添加类型强制转换可能是不正确的解决方案。)

第二个例子:

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);
    }
}
$ 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
int a = 21;
byte b1 = a;   // <<-- possible lossy conversion
byte b2 = 21;  // OK
  • 该值是编译时间常数表达式(包括文字)的结果。
  • 表达式的类型为byteshortcharint
  • 所分配的常量值在“目标”类型的域中是可表示的(不会丢失)。

请注意,这只适用于赋值语句,或者更严格地说,适用于赋值上下文。因此:

Byte b4 = new Byte(21);  // incorrect

给出编译错误。

 类似资料: