2015-08-27 167 views
2

我想覆蓋從父類繼承抽象方法的子類中的方法。我試圖改變泛型返回類型,但我有點困惑。Java:覆蓋通用方法

基礎通用類:

public abstract class BaseAdapter<T extends IEvent> { 
    private List<T> events; 

    public BaseAdapter(List<T> events) { 
     this.events = events; 
    } 

    public List<T> sort() { 
     // Some sorting... 
     return newFilteredEvents; 
    } 
} 

的子類:

public class AdapterEvent extends BaseAdapter<Event> { 
    public AdapterEvents(List<Event> events) { 
     super(events); 
    } 
} 

實施:

public abstract class BaseView extends View { 

    private BaseAdapter<IEvent> events; 

    @Override 
    protected View onCreate(Context context) { 
     View view = super.onCreate(context); 

     this.events = getAdapter(); 

     return view; 
    } 

    /** 
    * The child class should provide an adapter 
    */ 
    protected abstract BaseAdapter<IEvent> getAdapter(); 
} 

子視圖類,我想重寫參數化方法:

public class EventView extends BaseView { 

    @Override 
    protected View onCreate(Context context) { 
     return super.onCreate(context): 
    } 

    @Override 
    protected BaseAdapter<IEvent> getAdapter() { 
     List<Event> events = EventManager.getInstance().getEvents(); 

     return new AdapterEvent(events); 
    } 

} 

這是Eclipse是拋出一個錯誤信息:

Type mismatch: cannot convert from AdapterEvents to BaseAdapter<IEvent> 

注意的類和接口:事件和IEvent:

public interface IEvent { 
    public void setId(long id); 
    public long getId(); 

    public void setStartMillis(long start); 
    public long getStartMillis(); 

    public void setEndMillis(long end); 
    public long getEndMillis(); 
} 

和從IEvent

繼承了Model類
public class Event implements IEvent { 
    private long id; 
    private long startTime, endTime; 

    @Override 
    public void setId(long id) { 
     this.id = id; 
    } 

    @Override 
    public long getId() { 
     return this.id; 
    } 

    // The other inherited methods... 
} 

我想要實現的是寫更多的抽象代碼,因爲這些類,接口將被多個類擴展(在我的情況下不同的視圖類型)。這些是抽象類:BaseAdapter,BaseView,IEvent,這些是實現:AdapterEvent,EventView,Event

回答

4

這是因爲在Java中泛型類型變量沒有協變。

這意味着如果類型參數是多態的,那麼對於泛型類型您沒有多態性。實際上,List<Event>不是List<IEvent>的子類型,儘管Eventis-aIEvent

這就是爲什麼Java提供wildcards

protected abstract BaseAdapter<? extends IEvent> getAdapter(); 

所以,你可以這樣做:

protected BaseAdapter<? extends IEvent> getAdapter() { 
    .. 
    return new AdapterEvent(events); 
} 

基本上你是在告訴getAdapter返回延伸IEvent未指定類型的BaseAdapter編譯器。這允許你需要什麼。

1

更改BaseAdapter<IEvent>BaseAdapter<? extends IEvent>BaseView.events,和兩個getAdapter()方法。