당신은
public static class Vector<V extends Vector<V>>{
protected double[] components;
public final int dimensions;
private Class<V> klass;
protected Vector(int d, Class<V> klass) {
this.klass = klass;
this.components = new double[d];
}
public double get(int x) { return components[x] }
protected void set(int x, double d) { components[x] = d }
public V clone() {
try {
V c = klass.newInstance();
c.components = this.components.clone();
return c;
}
catch(InstantiationException e1) {}
catch(IllegalAccessException e2) {}
return null;
}
public V add(V that) {
V sum = this.clone();
for(int i = 0; i < dimensions; i++)
sum.components[i] += that.components[i];
return sum;
}
}
그런 다음 각각의 경우 파생 몇 가지 흥미로운 제네릭으로 Vector 클래스를 작성할 수 : 결국
public static class Vector2D extends Vector<Vector2D>{
public Vector2D() {
super(2, Vector2D.class);
}
public Vector2D(double x, double y) {
this();
set(0, x);
set(1, y);
}
}
public static class Vector3D extends Vector<Vector3D>{
public Vector3D() {
super(3, Vector3D.class);
}
public Vector3D(double x, double y, double z) {
this();
set(0, x);
set(1, y);
set(2, z);
}
}
public static class Vector4D extends Vector<Vector4D>{
public Vector4D() {
super(4, Vector4D.class);
}
public Vector4D(double w, double x, double y, double z) {
this();
set(0, w);
set(1, x);
set(2, y);
set(3, z);
}
}
을, 특별한 경우가있다 - 예를 들어, 크로스 제품은 3 차원과 7 차원으로 만 존재합니다. 각각에 대한 구현이 있으면이를 해결합니다.
실무 구현으로 내 대답을 업데이트했습니다. 그것은 아마도 과잉 공격 일 것입니다.하지만 그것이 어떻게 수행 될 수 있는지를 보여줍니다. – Eric