10

我很惊讶地看到 getters ofheightwidthmembers 有return类型double,尽管它们是int。此外,setSize具有双参数的方法具有以下定义:

/**
 * Sets the size of this <code>Dimension</code> object to
 * the specified width and height in double precision.
 * Note that if <code>width</code> or <code>height</code>
 * are larger than <code>Integer.MAX_VALUE</code>, they will
 * be reset to <code>Integer.MAX_VALUE</code>.
 *
 * @param width  the new width for the <code>Dimension</code> object
 * @param height the new height for the <code>Dimension</code> object
 */
public void setSize(double width, double height) {
    this.width = (int) Math.ceil(width);
    this.height = (int) Math.ceil(height);
}

请查看Dimension类。上面的评论说值不能超过 Integer.MAX_VALUE。为什么?为什么我们double介于两者之间?有什么微妙的原因吗?谁能给我解释一下?对不起我的坚持!

4

3 回答 3

4

java.awt.Dimension进行了改装以适应java.awt.geom包装,因此可以在Dimension2D需要的任何地方使用。后面的接口处理浮点,所以Dimension也必须处理。受限于int字段,只能double表示 s 的一个子集。Dimension2D.Float同样受到限制。

于 2012-02-28T18:51:28.957 回答
3

该类正在存储heightwidthas int,它只是提供了一个也接受 double 的方法,因此您可以使用 double 值调用它(但它们会立即转换为 int)。setSize()此文件中还有其他方法可以接受int值甚至是Dimension对象。

并且由于这些值被存储为int,当然它们的最大值是Integer.MAX_VALUE

于 2012-02-28T18:35:29.487 回答
1

您可以将 java Dimension 类与整数一起使用。如果您需要一个具有双倍宽度和高度的 Dimension 类,您可以使用以下内容:

public class DoubleDimension {
    double width, height;

    public DoubleDimension(double width, double height) {
        super();
        this.width = width;
        this.height = height;
    }

    public double getWidth() {
        return width;
    }

    public void setWidth(double width) {
        this.width = width;
    }

    public double getHeight() {
        return height;
    }

    public void setHeight(double height) {
        this.height = height;
    }

    @Override
    public String toString() {
        return "DoubleDimension [width=" + width + ", height=" + height + "]";
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        long temp;
        temp = Double.doubleToLongBits(height);
        result = prime * result + (int) (temp ^ (temp >>> 32));
        temp = Double.doubleToLongBits(width);
        result = prime * result + (int) (temp ^ (temp >>> 32));
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        DoubleDimension other = (DoubleDimension) obj;
        if (Double.doubleToLongBits(height) != Double.doubleToLongBits(other.height))
            return false;
        if (Double.doubleToLongBits(width) != Double.doubleToLongBits(other.width))
            return false;
        return true;
    }
}
于 2018-02-14T05:51:57.820 回答