5

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
}

或者这只是我的开发系统愚蠢的一个例子?

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

4

3 回答 3

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)作为第三个和第四个参数而不是两个字符串传递的事实有关。

于 2013-06-07T16:52:54.110 回答
4

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

例如,如果您创建一个List<Integer>,您可以向其中添加一个:从toint自动装箱。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);
    }
}

输出:

double
Object
Object
Unboxed!

但是请注意,您不能调用:

useIt((Double) a, b, c, d); // No autoboxing of "b"
于 2013-06-07T16:47:33.820 回答
-2

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

于 2013-06-07T16:48:31.097 回答