Java:重写泛型方法

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

我想重写参数化方法的 subview 类:

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>

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

我想要实现的是编写更抽象的代码,因为这些类、接口(interface)将由多个类(在我的例子中是不同的 View 类型)扩展。这些是抽象类:BaseAdapterBaseViewIEvent,这些是实现:AdapterEvent事件 View 事件

最佳答案

这是因为 Java 中泛型的类型变量不存在协变。

这意味着如果类型参数对于所需的类型参数是多态的,则泛型类型不具有多态性。实践List<Event>不是 List<IEvent> 的子类型即使Event is-a IEvent .

这就是 Java 提供 wildcards 的原因:

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

这样你就可以做到:

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

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

关于Java:重写泛型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32242898/

相关文章:

java - 使用扩展子变量覆盖父类变量

c++ - 查看对象是什么类

java - Websphere 中的 Eclipse Scout RAP UI 部署

java - Apache httpclient 未知主机问题

java - jaxws-maven-plugin 无法运行 wsimport (ErrorListener)

Java 内部类使用外部类的参数化类型

Ruby 错误处理 : Rescuing Exceptions in Subclasses

java - 如何使用 Spark Core API 读取 Parquet 文件?

typescript - 在不扩大的情况下推断通用类型

java - Java 中 vararg 的性能影响