如何在java中“类似”的3D矢量类之间进行转换?

时间:2011-09-04 23:44:04

标签: java type-conversion

我正在编写一个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;
  }
  ...
}

我的库有望补充第三方库的功能,该库也实现了一个矢量类,比如Vec3DVec3D类具有相同的字段(float xfloat yfloat 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中实现类似的东西,如果可能的话。

2 个答案:

答案 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));
    }
}