我有一个方面(用aspectj语法public aspect ....编写),它操作许多返回Collection的方法的结果,以便对结果进行分页。
我不能(或者我不知道如何)在建议中使用泛型,所以无论我在哪里调用建议的方法,我都会得到警告
unchecked conversion when advice applied at shadow method-call(java.util.Collection ...), expected java.util.Collection<T> but advice uses java.util.Collection [Xlint:uncheckedAdviceConversion]
我怎么才能摆脱这个?
斯特凡诺
-添加方面代码摘录
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
}
}使用实例
Collection<MyEntity> entities = myEntityService.findAll(criteria);这就是我得到警告的地方
发布于 2013-03-16 11:48:58
坏消息是:我不知道如何避免这种警告,因为我不太精通Java泛型,特别是不熟悉AspectJ,因为并不是所有您可能期望的都是语法允许的,例如将target()绑定到参数化类型(因为类型擦除限制)。
您可能与这一个邮件列表中的AspectJ有相同的问题。
好消息是:我终于用一个最少的代码示例来重现您的问题,使用了许多虚拟类,并对您如何在应用程序中使用它们做了一些有根据的猜测:
虚拟/助手类/方面:
package org.jcz.persistence;
public class EntitySupport {}package org.jcz.persistence;
public class MyEntity {}package org.jcz.persistence;
public class Pagination {}package org.jcz.persistence;
public class Criteria {
public Pagination getPagination() {
return new Pagination();
}
}package org.jcz.persistence;
import java.util.ArrayList;
import java.util.Collection;
public class Service<T> {
public Collection<T> findAll(Criteria criteria) {
return new ArrayList<T>();
}
}package org.jcz.persistence;
public abstract aspect ServiceSupportAspect {}您的方面,略有改变:
package org.jcz.persistence;
import java.util.ArrayList;
import java.util.Collection;
import org.apache.log4j.Logger;
public aspect PaginationSupportAspect extends ServiceSupportAspect {
private static final Logger log = Logger.getLogger(PaginationSupportAspect.class);
private pointcut paginate(Criteria criteria) :
call(Collection org.jcz.persistence.Service+.*(Criteria)) && args(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);
}
private <T extends EntitySupport> Collection<T> doPaginate(
Collection<T> source, Pagination pagination, Service<T> service)
{
System.out.println("doPaginate");
return new ArrayList<T>();
}
},现在是一个小型驱动程序,用于复制Xlint警告:
import java.util.Collection;
import org.jcz.persistence.Criteria;
import org.jcz.persistence.MyEntity;
import org.jcz.persistence.Service;
public class Application {
public static void main(String[] args) {
Service<MyEntity> myEntityService = new Service<MyEntity>();
Criteria criteria = new Criteria();
Collection<MyEntity> entities = myEntityService.findAll(criteria);
System.out.println("Found entities: " + entities);
}
}也许其他人能做些我做不到的事。我能做的就是复制它。我会把安迪·克莱门特引向这篇文章。祝好运!
https://stackoverflow.com/questions/15110442
复制相似问题