我正在编写一个geom包作为Java库的一部分,它有自己的vector类:
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;
}
...
}
我的库有望补充第三方库的功能,该库也实现了一个矢量类,比如Vec3D
。 Vec3D
类具有相同的字段(float x
,float y
和float z
)以及构造函数签名作为我的Vector3D
类。我只想在我的库中使用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中实现类似的东西,如果可能的话。
答案 0 :(得分: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 :(得分: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));
}
}