当前位置: 首页 > 知识库问答 >
问题:

Java:重写泛型方法

呼延曜灿
2023-03-14

我正在尝试覆盖子类中从父类继承抽象方法的方法。我正在尝试更改泛型返回类型,但我有点困惑。

基本泛型类:

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>

注意类和接口:事件和级别:

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...
}

我试图实现的是编写更抽象的代码,因为这些类、接口将被多个类扩展(在我的例子中是不同的视图类型)。这些是抽象类:< code>BaseAdapter,< code>BaseView,< code>IEvent,这些是实现:< code>AdapterEvent,< code>EventView,< code>Event。

共有2个答案

扈德容
2023-03-14

更改基本适配器

皇甫德庸
2023-03-14

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

这意味着,如果类型参数对于所需的类型参数是多态的,那么泛型类型就没有多态。练习<代码>列表

这就是为什么Java提供通配符:

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

这样你就可以做到:

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

基本上,您告诉编译器getAdapter返回一个未指定类型的BaseAdapter,该适配器扩展了IEvent。这允许你需要的东西。

 类似资料:
  • 来自Java文档:在类C中声明的实例方法m1覆盖在类A中声明的另一个实例方法m2,如果以下所有条件都为真:。。。。。m1的签名是m2签名的子签名(§8.4.2)。 方法m1的签名是方法m2签名的子签名,前提是:m1的签名与m2签名的擦除相同(§4.6)。 是对一个 如果是这样,什么是错的? EDIT1:或者如果我切换通用类型: 这种情况下有什么问题? EDIT2:我知道如何修复它,但我想了解,在这

  • 这是如何编译的: 但这并不是: 它给我以下编译错误: Impl不是抽象的,并且不会覆盖测试中的抽象方法getValue(整数) 错误:名称冲突:Impl中的getValue(T)和测试中的getValue(Integer)具有相同的擦除,但两者都不重写另一个 擦除不能确保t被整数替换吗?那么为什么第二个例子是无效的呢?

  • 我正在做一个体验,尝试用以下方式重写泛型类的方法: 为什么我不能?编译错误是 yGenFun。java:15:错误:对doX的引用不明确,Do中的方法doX(A)和MyGenFun中的方法doX(T)都匹配x.doX(“测试”);^其中A、T是类型变量:在类Do T中声明的extends对象扩展在类MyGenFun 1 error中声明的CharSequence 如果我注释“第1行”,我可以编译代

  • 安吉丽卡·兰格(Angelica Langer)在关于仿制药的常见问题解答中说(参见Technicalities.FAQ822): 如果这些方法具有具有不同边界的类型参数,则它们不会重写,因为这些方法的签名不是重写等价的。请记住,类型参数边界是泛型方法签名的一部分。 示例(泛型子类型方法重载泛型超类型方法;不推荐): 我不明白为什么方法在类中重载。据我所知,这应该是一个编译时错误,因为在和中具有相

  • Main.java:12:错误:TextMessage不是抽象的,并且不会覆盖Message类中的抽象方法setContent(T)TextMessage扩展Message{^其中T是类型变量:T扩展方法setContent(T)中声明的Object 1错误

  • 问题内容: 我有一个抽象类 Monitor.java ,它由类 EmailMonitor.java 子类 化 。 方法: 在 Monitor.java中 定义,并且必须在 EmailMonitor.java中 覆盖。 我目前在 EmailMonitor.java中 重写了如下方法: 但是,这会产生编译时错误: 是的子类,因此(至少在我看来)以这种方式覆盖它是很有意义的。看到编译器对我的逻辑不满意,