簡體   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