方法重载中的Java转换

时间:2014-12-16 07:22:44

标签: java casting overloading

我有方法重载,例如:

 public int sum1(int a, int b)
{
    int c= a+b; 
    System.out.println("The method1");
    return c; 
}
public float sum1(int a, float b)
{
    float c=  a+b;
    System.out.println("The method2");
    return c; 
}
public double sum1(float a, float b)
{
    double c=  (double) a+b;
    System.out.println("The method3");
    return c; 
}

从主要方法,假设我们有

 double x=10.10f;
 double y=10.20f; 

x和y的表观类型是double,但实际类型是float。当我打电话

System.out.println(" the output is :"+cc.sum1(x,y)); 

编译时的错误。

The method sum1(int, int) in the type Class is not applicable for the arguments double, double). 

它应该通过将double转换为float来进入sum1(即method3)

5 个答案:

答案 0 :(得分:11)

TL;此答案的DR版本:

  • 原始类型的变量在执行时到编译时从不具有不同的类型。 (double始终为double,永远不是float等。)
  • 使用编译时类型的表达式
  • 执行过载分辨率(选择使用哪种方法签名)
  • 使用方法调用
  • 的目标的执行时类型执行拾取签名的方法实现

  

x和y的表观类型是double,但实际类型是float

不,不是。您刚刚获得了从指定的float字面值到double值的转换。 实际值double

原语不像对象一样工作 - 例如,int变量中的int值仍然不是double

使用整数类型示例更简单。假设我们有:

byte b = 100;
int x = b;

x的值是32位整数,表示值100.它不知道"知道"它最初是从byte值分配的...恰好是在转让时从byte转换为int

将其与参考类型进行比较:

String x = "hello";
Object y = x;

此处,y确实的值是对String对象的引用。该类型信息被精确保存,因为可以包含它的整个对象,并且因为变量本身的值只是一个引用。 (这些位本身不需要作为任务的一部分进行更改 - 至少在一个简单的VM中,它们将是xy中完全相同的位,因为它们& #39;指的是同一个对象。)

但即使在这种情况下,也会根据参数的编译时类型而不是执行时的实际值来进行重载解析。变量的执行时类型涉及的唯一方法是使用基于方法调用目标的覆盖。如果我们有:

Foo f = new X();
Foo g = new Y();
Foo h = new Z();

f.someMethod(g, h);

...然后编译器将在Foo中查找一个方法,该方法有两个Foo参数(或Object或其他超类/接口) - 涉及的对象的实际类型是无关紧要的。但是,在执行时,如果在X中覆盖了该方法,则由于对象f的值的执行时类型,将调用该覆盖。 / p>

答案 1 :(得分:3)

将double转换为float可能会导致数据丢失,因为它是一个缩小的转换,因此不是由编译器自动完成的。如果你想要变量,你必须将变量显式地转换为浮动。

答案 2 :(得分:1)

不,变量的实际类型是double。您分配给double变量的常量的类型是float

答案 3 :(得分:0)

尝试添加新功能:public double sum1(double a,double b)。它会解决你的问题。 而且,这种铸造会导致数据丢失。

答案 4 :(得分:0)

Floats很有趣......他们总是试图自动转换为双打。此代码编译,每次都有浮点数。

    public class wood {
    public static void main(String[] args) {
        float x = 10.1f;
        float y = 10.2f;
        System.out.println("Sum of x and y = " + sum1((float)x, (float)y));
    }
    public static float sum1(float x, float y) {
        return (float)((float)x+(float)y);
    }
}

编辑;请注意,使用括号外的强制转换运算符将在括号内部计算后进行转换。所以;

System.out.println((int)(50.5 + 50.7));

将打印出101。

在java中,一些数据转换是自动的,而其他数据转换需要强制转换运算符..简而言之,java会自动进行扩展转换,而您必须使用强制转换运算符来缩小转换。

原始数据类型的层次结构如下:

字节// 1个字节(-128到127)

短// 2个字节(超过32,000给/从0开始)

int // 4个字节(超过20亿次给/从0开始)

长// 8字节(超过9 quintillion(10 ^ 18)给出/取0)

float // 4个字节(保存7个小数位)

double // 8个字节(保存15个小数位)

java不会自动缩小转换范围,因为这样数据就有丢失的风险。字节和短字都将自动成为整数。

short s = 5;
byte b = 5;
short sum = s + b;  //this will cause an error!

s和b自动扩展转换为int,如果没有强制转换操作符,则无法将int赋值为short。

short sum = (short)(s + b);

需要。