为什么Java不能区分对象和数字?

时间:2013-06-07 16:42:16

标签: java compilation

Java新手在这里;我对C#感到更舒服。那说,以下困惑我。我正在写作 一些在Java中具有不同参数签名的重载类。但是,它似乎无法区分Object和double。但是,它与Object和Double没有问题。有人可以解释一下发生了什么吗?

public void item(Object a, Object b, String c, String d) {/*Stuff*/}
public void item(double a, double b, String c, String d) {/*Stuff*/}

public void UseIt(double a, double b, Double c, Double d)
{
    item(a, b, someString, someOtherString);   // Claims it's ambiguous
}

或者这仅仅是我的开发系统愚蠢的情况?

对这个例子感到抱歉;它就像那些失败的那些(我无法真正放在这里),而且在输入之前我犯了错误,没有尝试过它......

3 个答案:

答案 0 :(得分:9)

这个类编译得很好(只是测试确定,把它放在Test.java中并从命令行编译)

public class Test {
    public void item(double a, double b, String c, String d) {/*Stuff*/}
    public void item(Object a, Object b, String c, String d) {/*Stuff*/}
    public void UseIt(double a, double b, Double c, Double d) {
        item(a, b, "", "");   // Claims it's ambiguous
    }
}

你的问题可能与你传递两个双打(c和d)作为第三和第四个参数而不是两个字符串有关。

答案 1 :(得分:4)

这是因为你的IDE(在这种情况下是误导性的)看到了可能的自动装箱。

例如,如果您创建List<Integer>,则可以向其添加int:自动装箱从intInteger。 Unxobing恰恰相反:Integerint。请注意,装箱和拆箱仅适用于数字基元类型(但不适用于数组)。

在这里,毫无疑问最终将选择double的方法(因为它更具体),但您的IDE认为存在可能的歧义。

此示例代码:

public final class Test
{
    public static void item(Object a, Object b, String c, String d)
    {
        System.out.println("Object");
    }

    public static void item(double a, double b, String c, String d)
    {
        System.out.println("double");
    }

    public static void unbox(final double d)
    {
        System.out.println("Unboxed!");
    }

    public static void useIt(double a, double b, Double c, Double d)
    {
        // primitives
        item(a, b, "", "");
        // cast to corresponding classes
        item((Double) a, (Double) b, "", "");
        // objects
        item(c, d, "", "");
        // unboxed by the "unbox" method which takes a "double" as an argument
        unbox(new Double(2.0));
    }

    public static void main(final String... args)
    {
        // Autoboxing of the third and fourth argument
        useIt(1.0, 1.0, 1.0, 1.0);
    }
}

输出:

double
Object
Object
Unboxed!

但请注意,您无法致电:

useIt((Double) a, b, c, d); // No autoboxing of "b"

答案 2 :(得分:-2)

由于您有两个具有4个参数的同名方法,因此编译器可能不知道您指的是哪个方法。您的电话未明确说明您要拨打哪个电话。您应该更改其中一个项目方法的名称或更具体地定义参数。