代码给了我一个错误,我无法解释为什么会发生这种情况。有人可以解释我做错了吗?
它表示long不能转换为int,但是当我将int切换为long时,我无法添加长的x + multx。
class MultCalc {
public static int multx(int x, int y) {
if (x == 0) return 0;
if (y == 0) return 0;
else return x + multx(x, y - 1);
}
public static void main(String[] args) {
long x = 77777;
long y = 1234;
MultCalc calc = new MultCalc();
long ans = calc.multx(x, y);
System.out.println(x + " times " + y + " equals " + ans);
}
}
给我的错误。
error: method multx in class MultCalc cannot be applied to given types;
long ans = calc.multx(x, y);
^
required: int,int
found: long,long
reason: actual argument long cannot be converted to int by method invocation conversion
1 error
答案 0 :(得分:4)
方法签名是
multx(int x, int y)
这是用两个long
来调用的。在这种情况下,long
无法隐式转换为int
。
您必须创建另一种方法来接受long
参数或将long
参数转换为int
。转换可能会导致数据丢失。
参见 2.4.6。输入转化次数和表表2-4。 Primitive Data Types中的Java原语类型转换:
Convert Convert To: From: boolean byte short char int long float double boolean - N N N N N N N byte N - Y C Y Y Y Y short N C - C Y Y Y Y char N C C - Y Y Y Y int N C C C - Y Y* Y long N C C C C - Y* Y* float N C C C C C - Y double N C C C C C C -
N:无法进行转换 C:表示转换 是一个缩小的转换,需要一个明确的演员 Y:转换是扩展转换,因此执行 Java自动和隐含地 Y *:表示转换是 一个自动扩大转换,但有一些最少 转换可能会丢失该值的有效数字。这个 将
int
或long
转换为float
或double
时可能会发生这种情况。该 浮点类型的范围比整数类型大,所以 任何int
或long
都可以由float
或double
表示。然而 浮点类型是数字的近似值,并不总是如此 保持与整数类型一样多的有效数字。
另请参阅JLS中的Conversions and Promotions。
答案 1 :(得分:0)
根据java language specification,long
类型可以存储从-9223372036854775808
到9223372036854775807
的值,包括long
。如果您要将int
转换为int
,则必须进行显式投射,因为-2147483648
类型只能存储2147483647
到long
的值,包括的。因此,如果存储在long ans = calc.multx((int)x, (int)y);
变量中的值太大,信息可能会丢失。它被称为Narrowing Primitive Conversion
您可以直接在方法调用中执行转换:
multx
方法int
会返回long
值,但您可以将其存储到Scanner sc = new Scanner(System.in);
Scanner input = null;
boolean isFile = false;
while (isFile == false){
System.out.println("Input file name:");
String fileName = sc.next();
File inputFile = new File(fileName);
if(inputFile.exists()){
input = new Scanner(inputFile);
isFile = true;
whitout显式广告中,因为不存在信息丢失的风险。
它被称为Widening Primitive Conversion