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