我们有两个几乎相同的进程类,除了一个用于处理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中的原始类型。可能上面的方法不对。
答案 0 :(得分:3)
我们有两个几乎相同的流程类,除了一个用于处理
float[]
数据而另一个用于int[]
数据。
不幸的是,你不能用泛型来做到这一点。你最好的选择是咬紧牙关,分别编写两个类;即没有仿制品。
理论上,您可以尝试将数组更改为Integer[]
和Float[]
,并将<T>
更改为<T extends Number>
。但是:
这可能涉及更改代码的其他部分。
可能会使您的处理代码变慢。
使用T extends Number
以通用方式表达处理算法可能很困难。首先,Number
接口不支持算术。
我想也可以通过将原始数组包装在某个类中来使它们看起来像(例如)整数的数组来解决这个问题。但这可能会给你截断,精度等问题...取决于你正在实现的算法。所以这只适用于有限的情况。
答案 1 :(得分:1)
您的方法不起作用,因为您尝试将+运算符应用于T类型的对象。但是,不能保证T将支持该操作,因此编译器不会让您这样做。不幸的是,没有一个限制可以放在可以纠正这个问题的泛型类型上。
如果你想用一个方法处理int []和float [],只需用浮点数做所有事情并根据需要转换整数。