在Java中,假设我们有一个带参数double a
的函数。如果我传递一个整数作为参数,它是否有效? (我的意思是,是否存在隐式转换?)在相反的情况下:如果我有例如一个整数作为参数,我传递一个双?
不幸的是,我目前无法编译我的代码,我想检查这个断言。感谢您的关注。
有关JLS - Section # 5.3的详细信息,请参阅Method Invocation Conversion
。
方法调用上下文允许使用以下之一:
- an identity conversion (§5.1.1) - a widening primitive conversion (§5.1.2) - a widening reference conversion (§5.1.5) - a boxing conversion (§5.1.7) optionally followed by widening reference conversion - an unboxing conversion (§5.1.8) optionally followed by a widening primitive conversion.
因此,根据规则#2,您的第一次调用(int
到double
)将正常工作。
但根据同一部分中引用的声明,第二次调用(double
到int
)将给出编译器错误: -
如果表达式的类型无法通过方法调用上下文中允许的转换转换为参数的类型,则会发生编译时错误。
因为你可以将double设置为一个整数,所以整数作为参数可以使用double作为参数。其他方式失败。在这种情况下,您需要将double转换为int。同样适用于普通受让人,例如......
int i = 6;
double d = 0;
d = i; /* ok
i = d ; /* not ok
你有时可以通过使你的函数获取Number
的参数来解决这个问题。这是Integer
和Double
都继承的对象,所以直到Double
数和Integer
数相同的点,这将起作用。
请注意,基元integer
和double
与对象Integer
和Double
之间存在差异。 Java使用自动装箱在函数调用等中自动在这些类型之间进行转换。
最初,原始类型会发生原始扩展。例如,你想打电话
int input = 5; //int variable;
apply(input); //calling method with int value.
但是你的类不包含一个方法,该方法接受int,因此编译器将进行原始扩展。它将检查任何带有java long参数的apply方法是否存在。如果存在,将调用该方法。如果不是,它将检查是否存在浮动参数的应用,然后它将被选中。如果这也没有找到它将寻找申请与双参数。
public void apply(long input) {
System.out.println("long"); // first pick by the compiler.
}
public void apply(float input) {
System.out.println("float"); // if above method not found this will be selected.
}
public void apply(double input) {
System.out.println("double"); // above two methods not present this will be selected.
}
接下来,如果找不到以上三种方法,那么编译器将寻找Autoboxing this并尝试将其转换为相应的包装器。对于它的java.lang.Integer.So它将检查apply与Integer参数。如果找到这个编译器将执行此方法。
public void apply(Integer input) {
System.out.println("Integer");
}
最后,如果上述情况都不存在,编译器将查找名称为apply的任何方法,该方法接受int ...或Integer ...并调用该方法。
public void apply(int... input) {
System.out.println("int...");
}
如果您的类仅包含以下两种方法
public void apply(long input) {
System.out.println("long");
}
public void apply(float input) {
System.out.println("float");
}
并且您希望将double值传递给此方法,它不会编译。
double input = 5d;
apply(input);
// The method apply(long) in the type YourClass
//is not applicable for the arguments (double
如果你想做那项工作,你必须输入强制转换为你的方法可以接受的东西。
apply((int) input);
然后编译器将尝试通过精确类型或原始扩展或自动装箱或阵列匹配方式找到匹配。