3

繰り返す必要のある2つの異なるタイプのセットがあり、セットのオブジェクトの値の1つを合計する必要があります。ジェネリックスでこれを行うにはどうすればよいですか?つまり、セットのタイプごとに2つの合計メソッドを記述しませんか?

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を1つのメソッドとして使用して、上記の2つのメソッドを作成するにはどうすればよいですか。何かのようなもの:

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ます。どんなアイデアや提案も大歓迎です。ありがとう

4

1 に答える 1

5

共通のインターフェースを定義しますScorable

public interface Scorable {
  int getScore();
}

Fooそしてそれをとで実装し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 に答える