我花了一些时间调试我的代码。
我发现的内容相当奇怪,我希望有人可以向我解释发生了什么。
首先,这会产生编译时错误:
double x = 5.0;
int y = x;
是的,因为您必须使用(double)
明确地将其转换为双精度。
我有一个包含以下构造函数的对象:
public class MovesValue {
private ArrayList<Integer> moves;
private Double value;
public MovesValue(Integer move, double value) {
this.moves = new ArrayList<Integer>();
moves.add(move);
this.value = value;
}
public MovesValue(ArrayList<Integer> moves, double value) {
this.moves = moves;
this.value = value;
}
public MovesValue() {
}
public MovesValue(double value) {
this.value = value;
}
}
在我的代码中,我正在调用这样的构造函数:
int moveToMake = beginMoves;
MovesValue rv = new MovesValue(moveToMake);
令我惊讶的是,Java调用了以double为参数的构造函数。
不应该抱怨找不到合适的构造函数吗?
我已经创建了构造函数,它现在也使用了Integer。然而,令我惊讶的是,Java仍然会调用带有double的构造函数。它是否需要使用Integer
代替int
?
好的,我觉得很傻。由于某种原因,IntelliJ没有编译我的MovesValue
。重新启动后,它完美地工作。所以我很抱歉这些人!
答案 0 :(得分:6)
Java隐式地将int
转换为double
没有问题 - 如果没有强制转换,以下内容完全有效:
int x = 5;
double y = x;
您对MovesValue
构造函数的调用成功,因为这是将int
传递给采用double
的构造函数时Java调用的相同类型的转换。
尝试将double
传递给采用int
的构造函数,这会在编译时导致问题:
public MovesValue(int value) { // <<== Changed the type of value
this.value = value;
}
...
double moveToMake = beginMoves;
MovesValue rv = new MovesValue(moveToMake); // <<== This does not compile
答案 1 :(得分:3)
只占用double
的构造函数是唯一匹配
MovesValue rv = new MovesValue(moveToMake);
它是唯一一个只有一个参数的构造函数,Java将使用widening primitive conversion (Section 5.1.2, JLS)将传入的int
moveToMake
转换为double
,以便它可以被传入。
要获取要调用的第一个构造函数(Integer, double)
,则还必须传递第二个数字参数。然后,Java会将int
列入Integer
,并接受double
作为第二个参数,或者加宽int
,float
,{{ 1}}等等,成为long
。