Java:重写泛型方法

Java:重写泛型方法,java,generics,inheritance,Java,Generics,Inheritance,我试图重写从父类继承抽象方法的子类中的方法。我正在尝试更改通用返回类型,但我有点困惑 基本泛型类: public abstract class BaseAdapter<T extends IEvent> { private List<T> events; public BaseAdapter(List<T> events) { this.events = events; } public List<T> so

我试图重写从父类继承抽象方法的子类中的方法。我正在尝试更改通用返回类型,但我有点困惑

基本泛型类:

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;
   }
}
以及从
IEvent

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
,这是因为Java中泛型的类型变量没有协方差

这意味着,如果类型参数是多态的,则泛型类型没有多态性。实际上,
列表
不是
列表
的子类型,即使
事件
事件

这就是Java提供以下功能的原因:

protected abstract BaseAdapter将
BaseAdapter
更改为
BaseAdapter
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);
   }

}
Type mismatch: cannot convert from AdapterEvents to BaseAdapter<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();
}
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...
}
protected abstract BaseAdapter<? extends IEvent> getAdapter();
protected BaseAdapter<? extends IEvent> getAdapter() {
  ..
  return new AdapterEvent(events);
}