2 回答
TA贡献1890条经验 获得超9个赞
最简单的方法似乎是在Vector类上有一个实例方法:
Vector make(double[] values) {
return new Vector(values);
}
然后在每个子类中覆盖它,使用协变返回类型:
class Vector3 extends Vector {
//...
@Override Vector3 make(double[] values) {
return new Vector3(values);
}
//...
}
然后你可以在你的 multiply 方法中调用它。
return vector.make(values);
但老实说,我不会尝试将向量的长度编码为类型。当你需要一个包含 57032 个元素的向量时会发生什么?您肯定不想为此创建一个特定的类,对吗?如果您有两个Vector具有相同数量元素的不同子类,会发生什么情况:它们是否兼容(例如相加)?
更自然地处理向量的语言(例如 MATLAB)不会将其构建到类型中;问问自己是否真的需要这里。
TA贡献1936条经验 获得超6个赞
如果它对性能至关重要,您实际上可能会考虑让 multiply 方法改变向量的状态,而不是创建一个新的。在我看来,这并不奇怪,只要它是确定性的和记录在案的行为即可。
但是,对于不可变向量类,您需要clone
向量。
public class Vector implements Cloneable {
// not a good idea to make it public, if you don't want any changes here
private double[] values;
public static <T extends Vector> T multiply(T vector, double k) {
Vector temp = vector.clone();
for(int i = 0; i < temp.values.length; i++)
temp.values[i] = k * temp.values[i];
// the clone method guarantees that 'temp' is of type T,
// but since it is not generic, the compiler cannot check it
@SuppressWarnings("unchecked")
T result = (T)temp;
return result;
}
protected Vector clone() {
try {
Vector vector = (Vector)super.clone();
vector.values = Arrays.copyOf(values, values.length);
return vector;
} catch (final CloneNotSupportedException exc) {
// this is a weird design choice of `Object.clone()`, too,
// but back then, we did not have annotations or anything equivalent
throw new AssertionError("we forgot to implement java.lang.Cloneable", exc);
}
}
}
添加回答
举报