Java Integer不能被强制加倍。构造函数调用强制执行

时间:2014-06-02 21:39:33

标签: java

我花了一些时间调试我的代码。

我发现的内容相当奇怪,我希望有人可以向我解释发生了什么。

首先,这会产生编译时错误:

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。重新启动后,它完美地工作。所以我很抱歉这些人!

2 个答案:

答案 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作为第二个参数,或者加宽intfloat,{{ 1}}等等,成为long