Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 这个方法模棱两可_Java_Compiler Errors_Overloading - Fatal编程技术网

Java 这个方法模棱两可

Java 这个方法模棱两可,java,compiler-errors,overloading,Java,Compiler Errors,Overloading,我试图理解方法重载,但无法理解以下示例中出现以下代码错误的原因 public class OverLoading_OverRiding { public static void main(String[] args) { OverLoading_OverRiding o = new OverLoading_OverRiding(); o.sum(5, 5); } void sum(int i, long j) { } voi

我试图理解方法重载,但无法理解以下示例中出现以下代码错误的原因

public class OverLoading_OverRiding {
     public static void main(String[] args) {
        OverLoading_OverRiding o = new OverLoading_OverRiding();
        o.sum(5, 5);
    }

    void sum(int i, long j) {   }
    void sum(long i, int j) {   }
}
我得到一个错误:

该类型的方法sum(int,long)不明确 重载\u重写

当我对同一个示例执行显式强制转换时,它会起作用:

    o.sum(5, (long)5);
我无法正确理解歧义类型错误的原因


编译器说它不知道调用哪个方法。原因调用不明确。

问题是,如果调用
o.sum(5,5),编译器不知道使用哪种方法

  • 他可以使用
    空和(inti,long j){}
    ,其中前5个为int,后5个为long

  • 他可以使用
    void sum(long i,int j){}
    其中,他取前5的长度,取第二个5的整数

  • 由于这两种方法在本例中都是有效的,并且编译器总是需要一个有效选项,因此您会收到错误消息,提示您的方法不明确

    如果调用
    o.sum(5,(long)5)
    它只匹配方法
    无效和(inti,long j){}


    问题是,为什么要以这种方式重载方法? 重载主要用于以下可选参数:

    void myMethod(int i) {}
    void myMethod(int i, bool b) {}
    void myMethod(int i, string s) {}
    
    所以你可以像这样调用这个方法:

    myMethod(42);
    myMethod(42, true);
    myMethod(42, "myString");
    

    也许这会给你一个方法重载的概念。

    因为
    5
    可以表示为
    long
    int
    两种方法,编译器在没有更多信息的情况下无法推断要调用哪一种方法,因为它们的方法签名与同一调用兼容

    当您将第二个参数强制转换为
    long
    时,编译器可以推断第二个签名可以使用,因为没有其他选项

    此外:


    这是因为5可以是隐式长或整数。。由于这个原因,方法调用是不明确的

    很简单,您必须在方法中传递正确的参数,即 在第一个例子o.sum(5,5l)中,第一个参数是int 5,第二个参数是5l 第二种情况(5l,5)。 这将很好

    原因如下

    案例1:总和(整数a,长b)

    这里的和(5,5)匹配这个方法

    怎么做? 因为第一个参数是int&调用方法也是int。现在下一个参数很长,但我们要传递int。所以呢?它满足加宽转换/隐式类型转换

    隐式类型转换示例:

    int i=10;
    double j;
    j=i;
    System.out.println(j);  // Output j=10.0
    
    同样的事情也发生在这里, sum(5,5)匹配=>sum(int,long)和sum(long,int)

    案例2:总和(长a,整数b)


    sum(5.0,5)匹配两种方法

    是的TobiasR我知道方法重载的概念,但我的问题是理解错误
    int i=10;
    double j;
    j=i;
    System.out.println(j);  // Output j=10.0