我试图覆盖子类中的方法,该子类从父类继承了抽象方法。我正在尝试更改通用返回类型,但我有些困惑。

基本的通用类:

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


我想覆盖参数化方法的子View类:

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>


注意类和接口:Event和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...
}


我要实现的目标是编写更多抽象的代码,因为这些类,接口将被多个类(在我的情况下为不同的View类型)扩展。这些是抽象类:BaseAdapterBaseViewIEvent,它们是实现:AdapterEventEventViewEvent

最佳答案

这是因为Java中泛型的类型变量没有协方差。

这意味着,如果类型参数对所需的类型多态,则您对通用类型没有多态性。实际上,即使List<Event> is-a List<IEvent>Event也不是IEvent的子类型。

这就是Java提供wildcards的原因:

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


这样您就可以:

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


基本上,您是在告诉编译器getAdapter返回扩展了BaseAdapter的未指定类型的IEvent。这可以满足您的需求。

07-26 04:03