因此,我试图为自己实现一个java版本的C ++的STL算法inner_product用于向量参数。到目前为止,我的代码(可能从根本上说是错误的)看起来像这样:
public static<T,K> double inner_product(Vector<T> v1, Vector<K> v2)
{
double isum = 0;
for(int i=0;i<v1.size()&&i<v2.size();i++)
{
isum+=v1.elementAt(i)*v2.elementAt(i);
}
return isum;
}
问题是对于类型T,K,操作符*是未定义的。但是到目前为止我的知识并不包括预定义的运算符,尽管据我所知,它在Java中也是不可能的。在实现泛型功能的方式中,任何帮助都会受到赞赏。提前谢谢。
答案 0 :(得分:3)
没有好办法,原因有两个:
T
,K
)必须引用对象类型,而不是基元。你能得到的最接近的是这样的(模数语法错误,我的泛型生锈):
public static<T extends Number,K extends Number> double inner_product(Vector<T> v1, Vector<K> v2)
{
double isum = 0;
for(int i=0;i<v1.size()&&i<v2.size();i++)
{
isum+=v1.elementAt(i).doubleValue()*v2.elementAt(i).doubleValue();
}
return isum;
}
这适用于原始类型的对象包装器,即Double
但不是double
等。
此外,与您的版本一样,无论传入何种类型,都会返回double
。由于类型擦除,这很难解决。
答案 1 :(得分:2)
T必须有一个定义为mutliply
的方法,以便您可以使用V
interface T {
double multiply(V v);
}
public static<T,K> double inner_product(Vector<T> v1, Vector<K> v2) {
double isum = 0;
for(int i=0; i<v1.size() && i<v2.size(); i++) {
isum += v1.elementAt(i).multiply(v2.elementAt(i));
}
return isum;
}
1998年,在Java 1.2 Collections库中,IMHO Vector被List取代。使用List可能是更好的选择。
你真的需要它是通用的吗?我只想使用双
public static double inner_product(List<Double> v1, List<Double> v2) {
double isum = 0;
for(int i=0; i<v1.size() && i<v2.size(); i++)
isum += v1.get(i) * v2.get(i);
return isum;
}
或效率使用double []或TDoubleArrayList
public static double inner_product(double[] v1, double[] v2) {
double isum = 0;
for(int i=0; i<v1.size() && i<v2.size(); i++)
isum += v1[i] * v2[i];
return isum;
}
答案 2 :(得分:1)
Java中没有运算符重载,乘法运算符仅适用于数字基元类型。如果你需要在泛型类型上执行此操作,则必须使它们实现一个接口,允许将它们转换为双精度类型:
public interface DoubleProvider
double getDouble();
}
然后,您可以定义以下方法:
public static <T extends DoubleProvider, K extends DoubleProvider> double innerProduct(Iterable<T> v1, Iterable<K> v2) {
Iterator<T> it1 = v1.iterator();
Iterator<K> it2 = v2.iterator();
double sum = 0D;
while (it1.hasNext() && it2.hasNext()) {
T t = it1.next();
K k = it2.next();
sum += t.getDouble() * k.getDouble();
}
return sum;
}
注意我的代码