2012-12-24 25 views
4

通用接口: 重寫與通用簽署的抽象方法,把它

public interface Matcher<T> { 
    public double getScore(T value1, T value2); 
} 

兩個實現類:

public StringMatcher implements Matcher<String> { 
    public double getScore(String value1, String value2) {...} 
} 

public DateMatcher implements Matcher<Date> { 
    public double getScore(Date value1, Date value2) {...} 
} 

到目前爲止,一切都很好。用StringDate代替T不是問題。 調用getScore()方法也遵循工作原理:當我有不明Matcher一個List,我想用getScore()方法

Matcher<String> matcher = new StringMatcher(); 
matcher.getScore("hello", "world"); 

問題開始。

public void test() { 
    List<Matcher<?>> list = new ArrayList<Matcher<?>>(); 
    list.add(new StringMatcher()); 
    list.add(new DateMatcher()); 

    for (Matcher<?> matcher : list) { 
     Object value1; 
     Object value2; 
     //Setting values value1 & value2 appropriate to the current matcher 
     matcher.getScore(value1, value2); 
    } 
} 

我不能調用matcher.getScore(value1, value2),因爲它無法處理對象參數。 而在這一點上,我不知道如何解決這個問題。我想保留實現類的接口和簽名以及它們的具體類型。如果沒有辦法繞過類型轉換或拋出異常就沒關係。

回答

8

你提出了想要的類型安全和不想要它之間的衝突,所以你只需要在他們之間做出決定。調用getScoreObject參數顯然是類型不安全的。現在

,如果你只是想一個類型不安全的技巧繞開編譯/運行時錯誤,你可以聲明列表爲List<Matcher>,這意味着你會從它檢索原始Matcher s,然後你會允許通過Object s。你得到一個unchecked轉換編譯器警告,雖然。

+0

+1。你比我快。爲了比較對象實例,需要一個「Matcher 」。如果你不知道它們的類型,任何其他類型的匹配器在比較對象實例時都有拋出異常的可能性。 –

+0

非常感謝,那正是我需要知道的。 –

0

這將是最好使用捕捉幫手,讓你可以使用匹配的參數類型(比如T),以及value1value2將被聲明爲這種類型的T的。

private <T> double helper(Matcher<T> matcher) { 
    T value1; 
    T value2; 
    //Setting values value1 & value2 appropriate to the current matcher 
    return matcher.getScore(val1, val2); 
} 

public void test() 
{ 
    List<Matcher<?>> list = new ArrayList<Matcher<?>>(); 
    list.add(new StringMatcher()); 
    list.add(new DateMatcher()); 

    for (Matcher<?> matcher : list) { 
     helper(matcher); 
    } 
} 
相關問題