2013-05-26 166 views
2

我有一些內容,通過這個接口生成:通過接口覆蓋泛型方法

public interface Content { 
    void addListener(ContentListener<?> listener); 
} 

GenericContent

public interface GenericContent extends Content { 
    @Override 
    void addListener(GenericContentListener listener); 
} 

這些ContentListenerGenericContentListener

public interface ContentListener<T extends Content> { 
    void ping(T content); 
} 

public interface GenericContentListener extends ContentListener<GenericContent> 
{ 
} 

我的問題是即方法addListener中到GenericContent是雙錯誤:

  • 方法GenericContent類型的addListener(ContentListener<GenericContent>)必須重寫或實現的超類型方法

  • 名稱衝突:該方法GenericContent類型的addListener(ContentListener<GenericContent>)具有相同的擦除作爲Content類型的addListener(ContentListener<?>)但不覆蓋它

我怎樣才能獲得相同的效果使用不同的技術?

+0

內容類不是通用的 - 方法中T是什麼?應該輸入 – Bohemian

回答

2

嘗試刪除@Override註釋。通常,在類中使用@Override,而不是在接口中使用@Override,告訴您此方法必須重寫另一個,並且如果它失敗(如超類方法簽名更改),則會引發編譯錯誤。這樣做爲我編譯了一些東西。我還做了一個好辦法,以結構:

public interface Content { 
    void addListener(ContentListener<? extends Content> listener); 
} 

public interface GenericContent extends Content { 
    void addListener(GenericContentListener listener); 
} 

public interface ContentListener<T extends Content> { 
    void ping(T content); 
} 

public interface GenericContentListener extends ContentListener<GenericContent> 
{ 
} 

現在除了這一點,你可能要考慮重新定義Content然後GenericContent這樣的:

public interface Content<T extends Content> { 
    void addListener(ContentListener<T> listener); 
} 

public interface GenericContent extends Content<GenericContent> { 
    void addListener(GenericContentListener listener); 
} 

既然這樣,你Content界面允許添加任何類型ContentContentListener。此更改強制添加ContentListener必須適用於此類型的Content

那麼,你很可能採取這一步,這樣做:

public interface Content<T extends Content, L extends ContentListener<T>> { 
    void addListener(L listener); 
} 

public interface GenericContent extends Content<GenericContent, GenericContentListener> { 

} 

現在,當有人實現GenericContent,它假定addListener方法的簽名是:

void addListener(GenericContentListener listener); 
+0

在Content中使用泛型是我的一個想法,但是,由於客戶僅使用Content界面,因爲沒有插入「」,所以出現警告很煩人。但我認爲這是唯一的方法......:\謝謝! –