2011-09-04 56 views
1

我正在寫一個GEOM產品包的都有自己的向量類的Java庫的一部分:如何轉換java中的「類似」3D矢量類?

package mypackage.geom; 

public class Vector3D { 
    public float x; 
    public float y; 
    public float z; 

    public Vector3D(float x, float y, float z) { 
    this.x = x; 
    this.y = y; 
    this.z = z; 
    } 
    ... 
} 

我的圖書館有望補充第三方庫,還實現了向量類的功能,說Vec3DVec3D類與我的Vector3D類具有相同的字段(float x,float yfloat z)和構造函數簽名。我只想使用第三方向量類,在我的庫中預期有一個Vector3D參數(例如,假設我有一個Camera類,它有一個setPosition(Vector3D vector3D)方法,並且我希望能夠將Vec3D實例傳遞給它)。

這在C++中是可能的。例如,人們可以從任何類的Vector3D聲明一個通用的明確的變流器的構造,以下列方式:

template <class C> 
explicit Vector3D(const C& c) : x(c[0]), y(c[1]), z(c[2]) {} 

一切,它需要的是,外國人類實現operator[]。如果可能的話,我想知道如何在Java中實現類似的東西。

+1

由於您的庫擴展這個其他圖書館,在那裏你不能簡單地用'Vec3D一個理由'班?如果由於某種原因你必須有自己的類,定義'Vector3D'來擴展'Vec3D'是否可行? –

+0

我應該說「補充」而不是「延長」。我更新了原文。 – nakednous

回答

2

有幾個選項,其中沒有一個和你展示的一樣好。首先,當然,你可以寫一個明確的構造函數:

Vector3d(Vec3d v) {this.x = v.x; this.y = v.y; this.z = v.z; } 

其次,你可以提供爲實現你定義一個接口的任何載體類型的工作構造(稱之爲「V」 :)

Vector3d(V v) {this.x = v.getX(); this.y = v.getY(); this.z = v.getZ(); } 

當然,任何隨機向量類的東西都會實現V的機會幾乎爲0,除非你是某種標準體。

你也可以提供一個構造函數一個double[],在假設大多數這樣的類型將提供toArray()排序方法:

Vector3d(double[] v) {this.x = v[0]; this.y = v[1]; this.z = v[2]; } 

這將使得它比較容易大多數其它矢量對象轉換成你的,而無需添加自定義構造函數。

1

我認爲這是來自任何(未知)一種類最接近你的轉換器的構造:

public vec(Object any) 
{ 
    try { 
     x = any.getClass().getDeclaredField("x").getDouble(any); 
     y = any.getClass().getDeclaredField("y").getDouble(any); 
     z = any.getClass().getDeclaredField("z").getDouble(any); 
    } catch (Exception e) { 
     throw(new RuntimeException("vec cannot handle class in constructor: "+any.getClass(),e)); 
    } 
}