gpt4 book ai didi

java - 如何实例化泛型类型?

转载 作者:搜寻专家 更新时间:2023-11-01 01:48:46 24 4
gpt4 key购买 nike

我正在为 Java 项目制作一些数学类(class)。我有一个 Vector3 类,但我还需要 Vector4 和 Vector2,但显然我不想复制粘贴我的代码 3 次。

所以我所做的是一个 Vector 类,它将成为所有 vector 的母类。我可以只使用没有子类的 Vector 类,但我更喜欢使用这些子类,因为我可以在它们上面添加特定的东西,比如 Vector3 中的欧拉角操作,而且我想使用 Vector4 作为四元数的母类。无论如何,这是我简化的 Vector 类:

public class Vector {

public double[] values;

public Vector(double[] values) {
this.values = values;
}

public int getLength() {
return values.length;
}

public static <T extends Vector> T multiply(T vector, double k) {

double[] values = new double[vector.getLength()];
for(int i = 0; i < values.length; i++)
values[i] = k* vector.values[i];
return new T(values);
}
}
public class Vector3 extends Vector {
public Vector3(double[] values) {
super(values);
}
}

问题是编译器不会让我实例化一个 T:“类型参数 T 不能直接实例化”。但我需要这个 T,因为我需要返回的 vector 与发送的 vector 类型相同。

如果我执行 new Vector2(4,2).multiply(42),我需要得到一个 Vector2 而不是一个 Vector。我还可以在 Vector2 中创建一个乘法方法,该方法调用 Vector multiply,然后将值复制到 Vector2 中,但是 1. 这很糟糕,2. 这意味着子 vector 之间有很多复制粘贴,3. 我需要性能,所以这并不理想。

我知道我可以使用反射来解决问题,但这些方法对性能至关重要,所以我必须尽可能简单。

我还考虑过更改参数中的 vector ,这样我就不必实例化一个新的 vector ,但这是一个非常糟糕的主意,因为它会导致奇怪的行为。

感谢任何帮助。

最佳答案

最简单的方法似乎是在 Vector 类上有一个实例方法:

Vector make(double[] values) {
return new Vector(values);
}

然后您在每个子类中覆盖它,使用协变返回类型:

class Vector3 extends Vector {
//...

@Override Vector3 make(double[] values) {
return new Vector3(values);
}

//...
}

然后您可以在乘法方法中调用它。

return vector.make(values);

但老实说,我不会尝试将 vector 的长度编码到类型中。当你需要一个包含 57032 个元素的 vector 时会发生什么?您肯定不想为此创建一个特定的类,对吗?如果您有两个具有相同数量元素的 Vector 子类,会发生什么情况:它们是否兼容(例如,相加)?

更自然地处理 vector 的语言(例如 MATLAB)不会将其构建到类型中;问问自己,您是否真的需要它。

关于java - 如何实例化泛型类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57539033/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com