2016-08-19 69 views
1

我想製作一個保存兩個數值的二維矢量。如通常的載體(即使是不同的數字類型)應該例如可加。 在C++中你可以這樣做:如何在Java中實現兩個二維向量?

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

你的例子有什麼問題?你期望發生什麼,發生了什麼? – byxor

+0

「但這不起作用」 - 沒有足夠的描述你正面臨的問題。你有編譯器錯誤嗎? – Fildor

+0

'x + = vec.x;'因爲'x'是私有的,所以''不會工作 – ArcticLord

回答

2

其中一個可能性,以實現這一目標,是使用BigDecimal類:

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()的調用。所以你有各種方式來做到這一點。

+0

@Hulk你說得很對,它只是一個印刷錯誤 – Andremoniy

+0

爲什麼不讓'double'這個'''''''''''''''那麼你不會有不必要的拳擊和拆箱。 – Jesper

+0

@Jesper,正好,但如果因爲某些原因需要'Number'類型:) – Andremoniy