0

尴尬,但我找不到我的方式的错误。无论我尝试什么M总是对象(不是实际的泛型类型)。我有一个简单的设置(M是一个 grails 域):

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

请温柔一点,这感觉就像一个大脑放屁/愚蠢的东西。

4

2 回答 2

1

我会说Type Erasure(或它的groovy等价物)。

所以M这只是为了编译时检查(至少在java中)。现在这在解释语言中是如何工作的有点有趣,但我认为你很可能是相关情况的受害者。

看起来 groovy 有更严格的要求,从源头完全丢弃通用信息。这可能会在运行时导致一些有趣的行为。

http://groovy.codehaus.org/Generics

于 2013-05-09T18:11:01.277 回答
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
    }
 }
于 2013-05-09T18:26:00.313 回答