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)
或者这只是我的开发系统愚蠢的情况?
抱歉这个例子; 它就像那些失败的(我不能真正放在这里),我犯了错误,在输入它之前不尝试它...
这个类编译得很好(只是测试确定,把它放在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)作为第三和第四个参数,而不是两个字符串有关.
这是因为您的 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)