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”给出了编译器错误。