2013-05-09 47 views
0

尷尬,但我無法找到我的方式中的錯誤。不管我嘗試什麼M總是對象(不是實際的泛型類型)。我有一個簡單的設置(M是一個Grails域):Groovy抽象控制器<域類>

class NewsController extends AbstractController<News> { 

} 

class AbstractController<M> { 

    def show(Long id){ 
     log.info(M) 
     // prints: INFO common.AbstractController - class java.lang.Object 
     def entity = M.get(id) //errors 
     // .. other code 
    } 
} 

請溫柔,這種感覺就像一個大腦放屁/一些愚蠢的。

+0

什麼是提出了這個?您是否嘗試修改控制器的腳手架模板並使用動態腳手架(或靜態)? – 2013-05-09 23:01:08

+0

我將我們的所有代碼抽象爲兩個非常基本的控制器,希望能夠使用泛型來綁定底層的域類型。 – Nix 2013-05-10 20:25:09

回答

0

那麼簡單,因爲它可能是,我想出了(的type erasures因爲,恕我直言的一大缺陷渲染類仿製藥沒用)是替代:

class AbstractController{ 
    abstract getDomainClass(); 
    def show(Long id){ 
     log.info(getDomainClass()) 
    } 
    def entity = getDomainClass().get(id) 
} 

class NewsController extends AbstractController { 
    def getDomainClass(){ 
     return News 
    } 
} 
1

我會說類型擦除(或其等價的常規)。

所以M是隻爲編譯時檢查(至少在java中)。現在,如何在解釋型語言中工作更有趣一些,但我認爲你很可能是相關環境的受害者。

看來groovy有更嚴格的要求,從源頭上徹底拋棄通用信息。這可能會在運行時導致一些有趣的行爲。

http://groovy.codehaus.org/Generics

+0

_model = M只是有人建議嘗試的東西,同樣的問題依然存在。我認爲這是類型擦除M總是對象。 – Nix 2013-05-09 18:14:26

+0

與log.info(M)相同。 M是毫無意義的。由於Type Erasure而編譯代碼後,它不存在。 – nsfyn55 2013-05-09 18:15:46

+0

所以我想一個更好的問題是你想要打印什麼。運行時控制器的通用類型? – nsfyn55 2013-05-09 18:19:54

相關問題