2013-05-09 49 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

相关问题