3

我有两种不同类型的集合需要迭代,并且集合对象的值之一需要求和。我如何使用泛型来做到这一点,即不为每种类型的 Set 编写两个求和方法?

private Double calculateFooScoreSum(final Set<Foo> fooScoreSet)
{
    Double sum = 0.0;
    for (final Foo score : fooScoreSet)
    {
        sum += score.getScore();
    }
    return sum;
}

private Double calculateBarScoreSum(final Set<Bar> barScoreSet)
{
    Double sum = 0.0;
    for (final Bar score : barScoreSet)
    {
        sum += score.getScore();
    }
    return sum;
}

如何使用泛型作为单一方法编写上述两种方法。就像是:

private static Double calculateScoreSum(Set<?> scoreSet)
{
    Double sum = 0.0;
    for(Object scoreObj : scoreSet){
        //Some casting magic 
        sum+=score.getScore();
    }
    return sum;
}

如果有帮助,getScore()方法在类FooBar. 任何想法和建议都非常感谢。谢谢

4

1 回答 1

5

定义一个通用接口,比如Scorable

public interface Scorable {
  int getScore();
}

Foo并用and实现它Bar

public class Foo implements Scorable {
  public int getScore () { return 1; }
}

public class Bar implements Scorable {
  public int getScore () { return 2; }    
}

然后,使用通配符定义一个可以接受任何类型的方法:Scorable

private static Double calculateScoreSum(Set<? extends Scorable> scoreSet) {
    Double sum = 0.0;
    for (Scorable score : scoreSet){
        sum += score.getScore();
    }
    return sum;
}

哪个可以接收,Set<Foo>或者Set<Bar>因为它们都实现Scorable

于 2012-09-17T01:34:17.630 回答