实际参数long不能通过方法调用转换转换为int

时间:2015-12-08 19:06:07

标签: java algorithm

代码给了我一个错误,我无法解释为什么会发生这种情况。有人可以解释我做错了吗?

它表示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

2 个答案:

答案 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 *:表示转换是   一个自动扩大转换,但有一些最少   转换可能会丢失该值的有效数字。这个   将intlong转换为floatdouble时可能会发生这种情况。该   浮点类型的范围比整数类型大,所以   任何intlong都可以由floatdouble表示。然而   浮点类型是数字的近似值,并不总是如此   保持与整数类型一样多的有效数字。

另请参阅JLS中的Conversions and Promotions

答案 1 :(得分:0)

根据java language specificationlong类型可以存储从-92233720368547758089223372036854775807的值,包括long。如果您要将int转换为int,则必须进行显式投射,因为-2147483648类型只能存储2147483647long的值,包括的。因此,如果存储在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