我想做一个泛型方法,使一个数字的List
的总和。
我尝试的是这样的:
public static <T extends Number> T sumList(List<T> data)
{
T total = 0;
for (T elem : data)
{
total += elem;
}
return total;
}
但问题是there is no += operator in T
和那个total can't be assigned to zero
。
我该怎么做呢?
谢谢
发布于 2010-10-04 02:25:04
有几种方法可以将它们组合在一起,但老实说,泛型根本不是这里的方法。为每个具体的原始包装器类型构建一个方法,并分别实现它们。让它泛型太让人头疼了;算术运算不能泛化。
将其泛化也不会真正获得任何好处。它是如此简单和恒定的代码,你不用担心代码重复,因为它不会改变。而且人们不会将他们自己的数字类型传递给你的代码;它所应用的类型域已经定义得很好并且是有限的。
发布于 2010-10-04 02:24:58
我最近已经这样做了(基于lambdaj代码),当心它需要您的所有元素都是同一类型(您不能真正添加Byte
和BigDecimal
),并且如果不是这样并且不能处理自定义Number
,则可能抛出CCE异常。
public class SumAggregator<T extends Number> {
public T aggregate(Iterable<T> iterable) {
T result = null;
for (T item : iterable) {
result = aggregate(result, item);
}
return result;
}
@SuppressWarnings("unchecked")
protected T aggregate(T first, T second) {
if (first == null) {
return second;
} else if (second == null) {
return first;
} else if (first instanceof BigDecimal) {
return (T) aggregate((BigDecimal) first, (BigDecimal) second);
} else if (second instanceof BigInteger) {
return (T) aggregate((BigInteger) first, (BigInteger) second);
} else if (first instanceof Byte) {
return (T) aggregate((Byte) first, (Byte) second);
} else if (first instanceof Double) {
return (T) aggregate((Double) first, (Double) second);
} else if (first instanceof Float) {
return (T) aggregate((Float) first, (Float) second);
} else if (first instanceof Integer) {
return (T) aggregate((Integer) first, (Integer) second);
} else if (first instanceof Long) {
return (T) aggregate((Long) first, (Long) second);
} else if (first instanceof Short) {
return (T) aggregate((Short) first, (Short) second);
} else {
throw new UnsupportedOperationException("SumAggregator only supports official subclasses of Number");
}
}
private BigDecimal aggregate(BigDecimal first, BigDecimal second) {
return first.add(second);
}
private BigInteger aggregate(BigInteger first, BigInteger second) {
return first.add(second);
}
private Byte aggregate(Byte first, Byte second) {
return (byte) (first + second);
}
private Double aggregate(Double first, Double second) {
return first + second;
}
private Float aggregate(Float first, Float second) {
return first + second;
}
private Integer aggregate(Integer first, Integer second) {
return first + second;
}
private Long aggregate(Long first, Long second) {
return first + second;
}
private Short aggregate(Short first, Short second) {
return (short) (first + second);
}
}
发布于 2011-01-15 21:16:48
您可以使用库,比如Generic Java Math (它的numbers部分),它为Numer子类提供泛型操作。它提供了一种通用的处理数字的方法,就像在你的例子中一样,但是通过传递算术对象来进行实际计算。请参阅主页上的示例。
它必须使用盒装类型,所以如果您需要速度,在Java中没有泛型实现可以做到这一点,您必须使用原始类型。
https://stackoverflow.com/questions/3850970
复制相似问题