繁体   English   中英

Java泛型-遇到棘手的情况

[英]Java generics - having trouble with a tricky situation

现在,我已经把头撞在墙上的墙上好几个小时了,我已经将其精炼为一小段代码。 您能看到错误在哪里吗?

public class Experiment {
   class BaseMessage<Messageable> {
      Messageable once;

      BaseMessage(Messageable x) {
         once = x;
      }
   }

   class BaseEntity {
      boolean handleMessage(BaseMessage<BaseEntity> theMessage) {
         return false;
      }

   }

   class StateMachine<Thing> {
      public boolean handleMessage(BaseMessage<Thing> msg) {
         return true;
      }

   }

   class VehicleEntity extends BaseEntity {
      public StateMachine<VehicleEntity> state;

      @Override
      boolean handleMessage(BaseMessage<VehicleEntity> theMessage) {
         return state.handleMessage(theMessage);
      }
   }
}

我在这一行收到编译器错误:

boolean handleMessage(BaseMessage<VehicleEntity> theMessage) {

错误是: "The method handleMessage(Experiment.BaseMessage<Experiment.VehicleEntity>) of type Experiment.VehicleEntity must override or implement a super type method"

请注意,这是我的真实代码的示例子集,可将其减少到最低限度,因此代码不会做任何明智的事情。 哇,如果您能解决这个问题,我将不胜感激!

如Miserable Variable所述,在VehicleEntity您有handleMessage(BaseMessage<VehicleEntity> theMessage)而不是handleMessage(BaseMessage<BaseEntity> theMessage) ,并且编译器期望在原始代码中使用后者。

主要替代方法是让BaseEntity接受“ self”类型的参数,如下所示:

class BaseEntity<T extends BaseEntity<T>> {
  boolean handleMessage(BaseMessage<T> message) {
    ...
  }
}
class VehicleEntity extends BaseEntity<VehicleEntity> {
  boolean handleMessage(BaseMessage<VehicleEntity> message) {
    ...
  }
}

BaseMessage<VehicleEntity>不是BaseMessage<BaseEntity>的子类型。 尝试这个

abstract class BaseEntity {
    abstract <B extends BaseEntity> boolean handleMessage(BaseMessage<B> theMessage) {
        return false;
    }
}

您希望VehicleEntity具有handleMessage方法,该方法仅接受BaseMessage<VehicleEntity>

我相信这仅在Java中是可能的,至少不能静态检查。 但是,您可能需要查看“ 好奇地重复使用”模板模式,以查看是否可以使其适合您。

尝试将泛型添加到类本身

   class BaseEntity<T> {
      boolean handleMessage(BaseMessage<T> theMessage) {
         return false;
      }

   }

   class VehicleEntity extends BaseEntity<VehicleEntity> {
      public StateMachine<VehicleEntity> state;

      @Override
      boolean handleMessage(BaseMessage<VehicleEntity> theMessage) {
         return state.handleMessage(theMessage);
      }
   }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM