首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java:泛型方法和数字

Java:泛型方法和数字
EN

Stack Overflow用户
提问于 2010-10-04 02:18:34
回答 4查看 7.2K关注 0票数 16

我想做一个泛型方法,使一个数字的List的总和。

我尝试的是这样的:

代码语言:javascript
复制
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

我该怎么做呢?

谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-10-04 02:25:04

有几种方法可以将它们组合在一起,但老实说,泛型根本不是这里的方法。为每个具体的原始包装器类型构建一个方法,并分别实现它们。让它泛型太让人头疼了;算术运算不能泛化。

将其泛化也不会真正获得任何好处。它是如此简单和恒定的代码,你不用担心代码重复,因为它不会改变。而且人们不会将他们自己的数字类型传递给你的代码;它所应用的类型域已经定义得很好并且是有限的。

票数 20
EN

Stack Overflow用户

发布于 2010-10-04 02:24:58

我最近已经这样做了(基于lambdaj代码),当心它需要您的所有元素都是同一类型(您不能真正添加ByteBigDecimal),并且如果不是这样并且不能处理自定义Number,则可能抛出CCE异常。

代码语言:javascript
复制
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);
    }
}

This code executed on ideone with examples

票数 4
EN

Stack Overflow用户

发布于 2011-01-15 21:16:48

您可以使用库,比如Generic Java Math (它的numbers部分),它为Numer子类提供泛型操作。它提供了一种通用的处理数字的方法,就像在你的例子中一样,但是通过传递算术对象来进行实际计算。请参阅主页上的示例。

它必须使用盒装类型,所以如果您需要速度,在Java中没有泛型实现可以做到这一点,您必须使用原始类型。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3850970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档