2012-09-17 81 views
3

我有兩種不同類型的需要迭代的集合,並且需要對集合中的對象的值之一進行求和。我怎麼能用泛型來做到這一點,即不用爲每種類型的集合編寫兩個求和方法?在循環中鑄造泛型Java 7

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。 任何想法和建議,非常感謝。 感謝名單

回答

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; }  
} 

然後,定義可以接受任何種的方法Scorable,使用wildcards

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

它們可以接收Set<Foo>或,因爲它們都執行Scorable

+1

另外,沒有理由將總和聲明爲「雙」對象。原始類型可以正常工作。 – LanguagesNamedAfterCofee

+1

@LanguagesNamedAfterCofee:的確,這只是複製了OP的原始結構。 –

+0

@JoãoSilva非常感謝你。這也解決了許多其他更大的問題。 – Panshul