【发布时间】:2021-10-09 10:11:54
【问题描述】:
我一直在学习 Java,最近了解了泛型类型,并想在我一直在研究的线性代数框架中使用它们。这是一些源代码。
package vector;
import java.util.Arrays;
abstract class AbstractVector <T> {
T[] vector;
public T get(int index) { return this.vector[index]; }
public void set(int index, T value) { this.vector[index] = value; }
public String toString() {
return Arrays.toString(this.vector);
}
public double dotProduct(AbstractVector<T> vector) {
double value = 0;
for (int i=0; i<vector.size(); i++) {
// This line causes issues
value += this.vector[i] * vector.get(i);
}
return value;
}
public int size() {
return this.vector.length;
}
}
当我尝试对我的泛型类型使用任何数学运算时,我得到一个错误 Operator '*' cannot be applied to 'T', 'T'。如何解决这个问题?
【问题讨论】:
-
通过不对泛型类型执行数学运算。它可以是 any 类型。就像
Dog。在Dog类上执行乘法是什么意思? Java 不支持用户类型的运算符重载。 -
@ElliottFrisch 回答得很好。要解决此问题,您可以将 T 限制为扩展 Numbers 所以
public class AbstractVector <T extends Number> -
@LuciferUchiha 对不起,这还不够。 Java 对原始数字类型(包括
char)进行数学运算,而不是对Number对象。