我能为float []和int []使用泛型吗?

时间:2011-05-16 03:42:21

标签: java

我们有两个几乎相同的进程类,除了一个用于处理float []数据,另一个用于int []数据。

我正在考虑将它们合二为一。我最初的想法是对float []和int []使用泛型。

Java generic对我来说是新的。所以我写了下面的测试方法,看看泛型是如何工作的,但我不能让它适合我。

public <T> T caculate(T[] values)
    {
        T result;
        for(int i = 0; i < values.length; i++)
        {
            result = result + values[i];
        }

        result = result/(values.length);
        return result;       
    }

任何人都可以为我修改上述方法吗? float和int是Java中的原始类型。可能上面的方法不对。

2 个答案:

答案 0 :(得分:3)

  

我们有两个几乎相同的流程类,除了一个用于处理float[]数据而另一个用于int[]数据。

不幸的是,你不能用泛型来做到这一点。你最好的选择是咬紧牙关,分别编写两个类;即没有仿制品。

理论上,您可以尝试将数组更改为Integer[]Float[],并将<T>更改为<T extends Number>。但是:

  • 这可能涉及更改代码的其他部分。

  • 可能会使您的处理代码变慢。

  • 使用T extends Number以通用方式表达处理算法可能很困难。首先,Number接口不支持算术。


我想也可以通过将原始数组包装在某个类中来使它们看起来像(例如)整数的数组来解决这个问题。但这可能会给你截断,精度等问题...取决于你正在实现的算法。所以这只适用于有限的情况。

答案 1 :(得分:1)

您的方法不起作用,因为您尝试将+运算符应用于T类型的对象。但是,不能保证T将支持该操作,因此编译器不会让您这样做。不幸的是,没有一个限制可以放在可以纠正这个问题的泛型类型上。

如果你想用一个方法处理int []和float [],只需用浮点数做所有事情并根据需要转换整数。