在java中预定义泛型的乘法

时间:2012-05-06 07:10:04

标签: java generics multiplication

因此,我试图为自己实现一个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中也是不可能的。在实现泛型功能的方式中,任何帮助都会受到赞赏。提前谢谢。

3 个答案:

答案 0 :(得分:3)

没有好办法,原因有两个:

  1. 类型参数(TK)必须引用对象类型,而不是基元。
  2. Java没有运算符重载。
  3. 你能得到的最接近的是这样的(模数语法错误,我的泛型生锈):

    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;
}

注意我的代码

  • 尊重Java命名约定
  • 接受任何类型的Iterable,而不仅仅是过时的Vector(自Java 1.2以来不再使用)