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
}
或者这仅仅是我的开发系统愚蠢的情况?
对这个例子感到抱歉;它就像那些失败的那些(我无法真正放在这里),而且在输入之前我犯了错误,没有尝试过它......
答案 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
:自动装箱从int
到Integer
。 Unxobing恰恰相反:Integer
到int
。请注意,装箱和拆箱仅适用于数字基元类型(但不适用于数组)。
在这里,毫无疑问最终将选择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个参数的同名方法,因此编译器可能不知道您指的是哪个方法。您的电话未明确说明您要拨打哪个电话。您应该更改其中一个项目方法的名称或更具体地定义参数。