2012-02-14 50 views
0

現在我已經把頭撞到了牆上,現在已經有好幾個小時了,我已經將它精簡到了一小段代碼。你能看到錯誤在哪裏嗎?Java泛型 - 在棘手的情況下遇到了問題

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"

請注意,這是我真正的代碼樣本子集將其降低到最小,從而代碼沒有做任何明智的事情。哇,如果你能想出來,我會非常感激!

+3

在'VehicleEntity'你有'的handleMessage(BaseMessage theMessage)''沒有的handleMessage(BaseMessage theMessage)'編譯器需要後者。 – 2012-02-14 01:22:10

+2

命名泛型參數可能會被讀作類型的東西可能會在稍後變得混亂('BaseMessage'中的'Messageable','StateMachine'中的'Thing')。 – Jeffrey 2012-02-14 01:26:50

+0

@Jeffrey,我知道你的意思了......當我寫作和閱讀代碼時,我發現一個字母的名字對我來說同樣令人困惑。更好的建議? – pitosalas 2012-02-14 01:30:18

回答

4

正如可變變量所述,在VehicleEntity中,您有handleMessage(BaseMessage<VehicleEntity> theMessage)而不是,並且編譯器在原始代碼中需要後者。

的主要替代爲BaseEntity採取「自」類型自變量如下:

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

@Misereable建議不起作用說... – pitosalas 2012-02-14 01:49:29

+0

@Miserable對原始錯誤的原因是正確的,但我認爲他/她沒有完全清楚該修復。這是Miserable的一個不同的建議。 (Miserable的解決方案的工作原理_if_你可以改變所有的呼叫者,但是你報告的錯誤信息表明你沒有或沒有。)繼續嘗試這種方法。 – 2012-02-14 02:20:24

+0

'class BaseEntity '足以滿足OP的目的 – newacct 2012-02-14 05:51:03

1
BaseMessage<VehicleEntity>

不是BaseMessage<BaseEntity>子類型。試試這個

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

對不起,這也行不通,我得到:「類型Experiment.VehicleEntity的handleMessage(Experiment.BaseMessage )方法必須覆蓋或實現一個超類型方法」...難倒 – pitosalas 2012-02-14 01:43:35

0

您想爲VehicleEntity有一個handleMessage方法,將只接受BaseMessage<VehicleEntity>

我相信這是唯一可能的Java,至少它不能被靜態檢查。但你可能想看看Curiously recurring template pattern,看看你是否能爲你工作。

0

嘗試增加泛型類本身

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); 
     } 
    }