Generics 如何使用AspectJ处理泛型结果?

Generics 如何使用AspectJ处理泛型结果?,generics,aop,aspectj,Generics,Aop,Aspectj,我有一个方面(使用aspectj语法公共方面编写…),它操纵许多方法的结果,这些方法返回集合,以便对结果进行分页 我不能(或者我不知道如何)在建议中使用泛型,所以无论我在哪里调用建议的方法,我都会得到警告 在影子方法调用(java.util.Collection…)中应用通知时未选中转换,预期为java.util.Collection,但通知使用java.util.Collection[Xlint:uncheckedaviconversion] 我怎样才能摆脱这个 斯特凡诺 --添加方面代码摘录

我有一个方面(使用aspectj语法
公共方面编写…
),它操纵许多方法的结果,这些方法返回
集合
,以便对结果进行分页

我不能(或者我不知道如何)在建议中使用泛型,所以无论我在哪里调用建议的方法,我都会得到警告

在影子方法调用(java.util.Collection…)中应用通知时未选中转换,预期为java.util.Collection,但通知使用java.util.Collection[Xlint:uncheckedaviconversion]

我怎样才能摆脱这个

斯特凡诺

--添加方面代码摘录

public aspect PaginationSupportAspect extends ServiceSupportAspect {

    private static final Logger log = LoggerFactory.getLogger(PaginationSupportAspect.class);

    private pointcut paginate(Criteria criteria) : call(Collection org.jcz.persistence.Service+.*(Criteria));

    @SuppressWarnings({ "unchecked", "rawtypes" })
    Collection around(Criteria criteria, Service service) : paginate(criteria) && target(service) {
        log.trace(String.format("Executing <%s> @ <%s>", this.getClass(), thisJoinPoint.toLongString()));

        return doPaginate(proceed(criteria, service), criteria.getPagination(), service);
    }

    /**
     * 
     * @param source
     * @param criteria
     * @return
     */
    private <T extends EntitySupport> Collection<T> doPaginate(Collection<T> source, Pagination pagination, Service<T> service) {
        // IMPLEMENTATION OMITTED BECAUSE IT'S QUITE LONG

        // What it does is to create another Collection<T> that holds the pagination coordinates (page number, size, count) 
        // and only the elements of the requested page
    }

}
公共方面分页支持方面扩展了ServiceSupportSpect{
私有静态最终记录器log=LoggerFactory.getLogger(PaginationSupportAspect.class);
私有切入点分页(标准):调用(Collection org.jcz.persistence.Service+.*(标准));
@SuppressWarnings({“unchecked”,“rawtypes”})
收集周围(标准、服务):分页(标准)和目标(服务){
trace(String.format(“Executing@”、this.getClass()、thisJoinPoint.toLongString());
返回dopagine(继续(标准,服务),criteria.getPagination(),服务);
}
/**
* 
*@param源
*@param标准
*@返回
*/
私有集合doPaginate(集合源、分页、分页、服务){
//省略了实现,因为它相当长
//它所做的是创建另一个保存分页坐标(页码、大小、计数)的集合
//并且只包含请求页面的元素
}
}
用法示例

Collection<MyEntity> entities = myEntityService.findAll(criteria);
Collection entities=myEntityService.findAll(标准);

这就是我得到警告的地方。坏消息:我不知道如何避免警告,因为我对Java泛型不太精通,特别是在AspectJ方面,因为在语法上并不允许您期望的一切,例如,将
target()
绑定到参数化类型(由于类型擦除限制)

您可能遇到了与AspectJ邮件列表相同的问题

好消息是:我终于设法用最少的代码示例重现了您的问题,使用了许多虚拟类,并对您在应用程序中如何使用它们进行了一些有根据的猜测:

虚拟/辅助类/方面:

package org.jcz.persistence;
公共类EntitySupport{}
package org.jcz.persistence;
公共类MyEntity{}
package org.jcz.persistence;
公共类分页{}
package org.jcz.persistence;
公共类标准{
公共分页getPagination(){
返回新分页();
}
}
package org.jcz.persistence;
导入java.util.ArrayList;
导入java.util.Collection;
公务舱服务{
公共收集findAll(标准){
返回新的ArrayList();
}
}
package org.jcz.persistence;
公共抽象方面ServiceSupportSpect{}
您的外貌略有变化:

package org.jcz.persistence;
导入java.util.ArrayList;
导入java.util.Collection;
导入org.apache.log4j.Logger;
公共方面分页支持方面扩展服务支持方面{
私有静态最终记录器log=Logger.getLogger(PaginationSupportAspect.class);
专用切入点分页(标准):
调用(Collection org.jcz.persistence.Service+.*(标准))&&args(标准);
@SuppressWarnings({“unchecked”,“rawtypes”})
收集周围(标准、服务):分页(标准)和目标(服务){
trace(String.format(“Executing@”、this.getClass()、thisJoinPoint.toLongString());
返回dopagine(继续(标准,服务),criteria.getPagination(),服务);
}
私人收藏(
集合源、分页(分页、服务)
{
System.out.println(“doPaginate”);
返回新的ArrayList();
}
}
现在是一个小的驱动程序应用程序,它再现了Xlint警告:

import java.util.Collection;
导入org.jcz.persistence.Criteria;
导入org.jcz.persistence.MyEntity;
导入org.jcz.persistence.Service;
公共类应用程序{
公共静态void main(字符串[]args){
服务myEntityService=新服务();
标准=新标准();
集合实体=myEntityService.findAll(标准);
System.out.println(“找到的实体:+实体”);
}
}

也许其他人可以做一些我做不到的事情。我能做的最好的事情就是复制它。我会尝试将Andy Clement指向这篇文章。祝你好运!

@m0skit0,我在问题的末尾添加了代码。由于你的代码示例中有许多遗漏,几乎不可能重现你的情况。你使用的类/接口如标准、EntitySupport、MyEntity、分页、服务、ServiceSupportSpect,并且很难理解它们之间的关系。我需要查看更多代码或获得一个最小的、自包含的示例(可能使用虚拟类)为了重现问题,我可以编译并运行它。等一下,也许我重现了它,请参见下面。我知道这一个很旧,但仍然列为未回答。如果我的答案合适,请您接受并更新我的答案。我已经向您解释了问题发生的原因以及如何重现它。我无法更改AspectJ的限制谢谢你。给你增加了一个投票。但是不能将它标记为已解决。无论如何谢谢你的帮助。