[英]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.