在 Java 中,假设我们有一个带有参数的函数double a
。如果我将整数作为参数传递,它会起作用吗?(我的意思是,是否存在隐式转换?)在相反的情况下:如果我有一个整数作为参数,并且我传递了一个双精度数?
不幸的是,我目前无法编译我的代码,我想检查一下这个断言。感谢您的关注。
在 Java 中,假设我们有一个带有参数的函数double a
。如果我将整数作为参数传递,它会起作用吗?(我的意思是,是否存在隐式转换?)在相反的情况下:如果我有一个整数作为参数,并且我传递了一个双精度数?
不幸的是,我目前无法编译我的代码,我想检查一下这个断言。感谢您的关注。
有关. _ _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.
因此,您的第一次调用(int
to double
)将根据规则 #2正常工作。
但是根据同一部分中进一步引用的语句,第二次调用( double
to int
)将给出Compiler Error :-
如果无法通过方法调用上下文中允许的转换将表达式的类型转换为参数的类型,则会发生编译时错误。
因为您可以将双精度设置为整数,所以整数作为参数可以使用双精度作为参数。其他方式失败。在这种情况下,您需要将 double 类型转换为 int。同样适用于正常的分配,例如..
int i = 6;
double d = 0;
d = i; /* ok
i = d ; /* not ok
有时你可以通过让你的函数接受一个参数来解决这个问题Number
。这是一个既继承Integer
又Double
继承的对象,因此直到Double
数字和Integer
数字行为相同的点,这将起作用。
integer
请注意,原语anddouble
和 Objects Integer
and之间存在差异Double
。Java 使用自动装箱在函数调用等中自动转换这些类型。
最初,原始类型会发生原始扩展。例如你想打电话
int input = 5; //int variable;
apply(input); //calling method with int value.
但是您的类不包含参数接受int的方法,因此编译器将进行原始扩展。它将检查是否存在java long参数的任何apply方法。如果存在,将调用该方法。如果不是,它将检查是否存在浮动参数,然后将其选中。如果那也找不到,它将使用双重参数查找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.
}
接下来,如果以上三个方法都没有找到,那么编译器将寻找自动装箱并尝试将其转换为相应的包装器。对于int它的java.lang.Integer 。因此它将使用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);
然后编译器将尝试通过精确类型或原始扩展或自动装箱或数组匹配方式找到匹配项。