Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.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 - Fatal编程技术网

Java 为什么编译器会尝试加宽和加宽为什么不加宽?

Java 为什么编译器会尝试加宽和加宽为什么不加宽?,java,Java,当调用一个特定的方法时,我读到宽框是首选的,为什么不宽框呢。有谁能用一个小例子来解释为什么。答案很简单:只能加宽原语。因此,编译器必须在装箱前加宽。加宽:使用较窄的参数类型调用方法 public class Test { static void doIt(long l) { } public static void main(String[] args) { int i = 1; doIt(i); // OK: int i is widened t

当调用一个特定的方法时,我读到宽框是首选的,为什么不宽框呢。有谁能用一个小例子来解释为什么。

答案很简单:只能加宽原语。因此,编译器必须在装箱前加宽。

加宽:使用较窄的参数类型调用方法

public class Test {
    static void doIt(long l) { }
    public static void main(String[] args) {
        int i = 1;
        doIt(i); // OK: int i is widened to long
    }
}
装箱:调用具有原始参数的包装器类型的方法

public class Test {
    static void doIt(Integer i) { }
    public static void main(String[] args) {
        int i = 1;
        doIt(i); // OK: int i is boxed to Integer
    }
}
加宽然后装箱:不起作用

public class Test {
    static void doIt(Long l) { }
    public static void main(String[] args) {
        int i = 1;
        doIt(i); // FAILS. Cannot widen int to long and then box to Long
    }
}
装箱然后加宽:仅当加宽到超类型时有效

public class Test {
    static void doIt(Number n) { }
    static void go(Long l) { }
    public static void main(String[] args) {
        int i = 1;
        doIt(i); // OK. i is boxed to Integer, and Number is a supertype of Integer
        go(i); // FAILS: Long is not a supertype of Integer
    }
}

从SCJP研究材料中,我可以告诉您:

调用方法时,将按此顺序检查以下内容,如果找到匹配项,则将调用相应的方法:

1) Widening (preferred: 1st option to be chosen)
2) Boxing
3) Var args

这就是它的工作方式!注意秩序

没有任何背景,我们就没有希望回答这个问题。什么是“宽”和“盒”?如果你能举一个小例子来说明你相信它的意思,那将非常有帮助。我很确定,对于Java来说,加宽和装箱是众所周知的术语。int到long会变宽,int到Integer会变短。向网站上声誉最高的人解释这件事,我觉得非常可笑。@Jon。。不要说Jon你不知道加宽和拳击:D.@R.Bemrose-我打赌感觉很好:)@gurukulki:我知道什么是加宽转换和拳击转换,但你的问题毫无意义。请不要让人们猜到你的意思。我认为你展示的宽和框是有效的,因为你可以从宽int到长。这就是加宽的意义所在。一次你说它可以,一次又一次你说它不能。将示例粘贴到你的IDE中。我注释的行“FAILS”给出了编译器错误。