我想制作一个包含两个数值的二维矢量。 通常的矢量(即使是不同的数字类型)应该例如可以添加。 在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。
答案 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()
调用的需要。所以你有各种各样的方法去做。