两个如何在Java中实现二维向量?

时间:2016-08-19 13:39:06

标签: java generics

我想制作一个包含两个数值的二维矢量。 通常的矢量(即使是不同的数字类型)应该例如可以添加。 在C ++中,您可以执行以下操作:

template<typename T>
class vector2d{

    T x{0};
    T y{0};

public:
    template<typename U> vector2d& operator+=(const vector2d<U>& vec){
        x += vec.x;
        y += vec.y;
        return *this;
    }
    ...

template<typename U>
friend class vector2d;
};

但是当我尝试用Java实现这一点时,我遇到了一些问题。 这是我试图做的:

class vector2d<T extends Number>{

    private T x;
    private T y;

    public <U extends Number> vector2d add(vector2d<U> vec){
        x += vec.x;
        y += vec.y;
        return this;
    }
    ... 
}

但这不起作用。如果我会使用Integer或Float或其他任何东西(因为Autoboxing)。但是,当您直接使用Number类时,情况似乎并非如此。我认为没有其他界面可以满足要求,我有点困在这里。 所以我的问题是,是否有办法让这项工作用Java。

1 个答案:

答案 0 :(得分:2)

实现这一目标的可能性之一是使用BigDecimal class:

class vector2d{

    private BigDecimal x;
    private BigDecimal y;

    public void add(vector2d vec){
        x = x.add(vec.x);
        y = y.add(vec.y);
    }
    ...
}

但它可能会降低代码的性能,因为它的操作速度不是很快。 您也可以保留Number课程并始终使用doubleValue

class vector2d{

    private Number x;
    private Number y;

    ...

    public void add(vector2d vec){
        x = x.doubleValue() + vec.x.doubleValue();
        y = y.doubleValue() + vec.y.doubleValue();
    }

}

这将允许使用任何类型的数字:

    vector2d v1 = new vector2d(1, 2.3);
    vector2d v2 = new vector2d(1.3, 2);
    v1.add(v2);

UPD :正如@Jesper所提到的,可以使用Number而不是double类型,这将消除.doubleValue()调用的需要。所以你有各种各样的方法去做。