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

Bob*_*ter 5 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
}
Run Code Online (Sandbox Code Playgroud)

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

抱歉这个例子; 它就像那些失败的(我不能真正放在这里),我犯了错误,在输入它之前不尝试它...

Gio*_*tti 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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 这是唯一正确的答案,具有讽刺意味 - "你的问题是错的". (7认同)

fge*_*fge 4

这是因为您的 IDE(在本例中是误导性的)看到了可能的自动装箱。

例如,如果您创建一个List<Integer>,您可以向其中添加一个:从到int都有自动装箱。Unxobing 则相反:到. 请注意,装箱和拆箱仅适用于数字基元类型(但不适用于它们的数组)。intIntegerIntegerint

在这里,毫无疑问double最终会选择 with 的方法(因为它更具体),但您的 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

double
Object
Object
Unboxed!
Run Code Online (Sandbox Code Playgroud)

但请注意,您不能调用:

useIt((Double) a, b, c, d); // No autoboxing of "b"
Run Code Online (Sandbox Code Playgroud)

  • 是的,但是 jvm 不应该因为过载而装箱。如果我用“”替换 someString 和 someOtherString,他发布的代码可以正确编译 (4认同)