在循环Java 7中转换泛型类型

时间:2012-09-17 01:31:46

标签: java generics java-7

我有两种不同类型的需要迭代的集合,并且集合中对象的一个​​值需要求和。我怎么能用泛型来做这个,即不为每种类型的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;
}

如何使用Generics作为单个方法编写上述两种方法。喜欢的东西:

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

如果有帮助,getScore()Foo类都存在Bar方法。 任何想法和建议都非常感谢。 感谢名单

1 个答案:

答案 0 :(得分:5)

定义一个通用界面,比如Scorable

public interface Scorable {
  int getScore();
}

并使用FooBar

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

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

然后,使用wildcards定义一个可以接受任何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