为了账号安全,请及时绑定邮箱和手机立即绑定

Java的反射 和 泛型的一个问题

Java的反射 和 泛型的一个问题

MMMHUHU 2019-04-08 11:16:50
大概摘要一些在这里Classclazz=this.getClass();UpdateOperationsup=ds.createUpdateOperations(clazz);ds.update(ds.createQuery(clazz).filter("_id",id),up);完整的在https://github.com/mongodb/morphia/issues/542mophia是一个mongodb的ORM框架,然后我在一个基类里写了一个update方法,希望可以动态根据子类类型,利用反射完成一些更新任务。但是morphia的update方法有两个泛型方法:Tupdate(T,UpdateOperationsTupdate(Query,UpdateOperations)我在用ant编译的时候报错了,提示说ds.update(ds.createQuery(clazz).filter("_id",id),up);匹配了以上2个方法,有歧义。最奇怪的是eclipse调试什么的都没问题,只是一个unchecked的警告而已:Typesafety:Uncheckedinvocationupdate(Query,UpdateOperations)ofthegenericmethodupdate(Query,UpdateOperations)oftypeDatastore而且可以从警告看出,是匹配了上面第二个update方法。不知道应该怎么解决,是不是编译的时候要设置一些参数呢?
查看完整描述

2 回答

?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

谢谢@halty的解释,知道类型擦除导致歧义。
我经过修改之后改成如下形式,编译成功了:
Classclazz=this.getClass();
Queryquery=ds.createQuery(clazz).filter("_id",id);
UpdateOperationsup=ds.createUpdateOperations(clazz);
ds.update(query,up);
之前的思路不对,一直想着怎怎么获取子类的类型,其实这个update方法里面,类型真的没有什么作用,只是利用传入参数clazz这个Class类型的对象来反射来解析Domain对象的字段而已,而Query中是什么类型根本无关紧要,所以我们只要显示指定一个类型,让编译器能明确无歧义匹配上第二个方法就可以了。按照这样的思路我显示指定模板为基类DomainBase,这样就可以明确匹配第二种update方法了。
我想就算我把Query改成Query甚至Query都没问题。
                            
                            
查看完整回答
反对 回复 2019-04-08
  • 2 回答
  • 0 关注
  • 263 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消