2011-12-27 59 views
1

很麻煩的Java問題。此代碼有錯誤:關於通用有界通配符類型的混淆

public abstract class SubTypeDependentEditor<T> implements Editor<T> { 
    protected abstract Editor<? extends T> getEditorFor(T obj);  

    public void edit(T obj) { 
    Editor<? extends T> editor = getEditorFor(obj); 
    editor.edit(obj); // ERROR IS HERE 
    } 
} 

什麼是解決它的正確方法?

T的想法基本上是一個類型類層次結構根的,所以給出一個層次是這樣的:

class Entity {} 
class EntityA extends Entity {} 
class EntityB extends Entity {} 

一個將T設置爲EntitygetEditorFor(T obj)負責返回Editor<X>其中X依賴在obj的具體類型和總是Is-A T。因此,如果您有SubTypeDependentEditor<Entity>,getEditorFor(T obj)返回Editor<EntityA>objEntityAEditor<EntityB>objEntityB

任何機會,這可以實施沒有警告?

更新:

protected abstract Editor<? extends T> getEditorFor(T obj);  

基本上可以有其他的簽名,但是實現的代碼只有那些Editor<X>對象,所以在這種情況下,方法返回Editor<T>我不知道如何實現getEditorFor(T obj)代碼。

+1

代碼給出的錯誤是什麼? – chrisbunney 2011-12-27 20:10:05

+2

在某些地方使用通配符('?extends T'),而不是僅僅使用'T',你的理由是什麼? – 2011-12-27 20:11:25

+0

編譯器實際上說錯了什麼?編輯器界面中定義了編輯方法嗎? – Natix 2011-12-27 20:12:26

回答

4
protected abstract Editor<? extends T> getEditorFor(T obj); 

意味着getEditorFor()返回未知子類型T

你不能通過使用T類型的任何值與結果的編輯器,因爲編譯器不能證明obj作品與T的同一具體子類型即obj的類型。

的解決方案是改變

protected abstract Editor<? extends T> getEditorFor(T obj); 

protected abstract Editor<? super T> getEditorFor(T obj); 

它說,getEditorFor返回編輯未知類型,其包括obj的編輯器。