大概摘要一些在这里
Class clazz = this.getClass();
UpdateOperations up = ds.createUpdateOperations(clazz);
ds.update(ds.createQuery(clazz).filter("_id",id), up);
完整的在 https://github.com/mongodb/morphia/issues/542
mophia是一个mongodb 的ORM框架,然后我在一个基类里写了一个update方法, 希望可以动态根据子类类型,利用反射完成一些更新任务。
但是morphia的update方法有两个泛型方法:
T update(T,UpdateOperations<T>
T update(Query<T>,UpdateOperations<T>)
我在用ant编译的时候报错了,提示说 ds.update(ds.createQuery(clazz).filter("_id",id), up); 匹配了以上2个方法,有歧义。 最奇怪的是eclipse调试什么的都没问题,只是一个unchecked的警告而已:
Type safety: Unchecked invocation update(Query, UpdateOperations) of the generic method update(Query
, UpdateOperations ) of type Datastore
而且可以从警告看出,是匹配了上面第二个update方法。
不知道应该怎么解决,是不是编译的时候要设置一些参数呢?
模板方法在编译过程中类型擦除:
morphia的update方法不光是一个模板方法,还是一个重载方法。重载方法是在编译时确定具体调用哪个方法,由于你在传参的时候,没有传入类型参数:
由于Query可以同时匹配Query和Object类型,所以会造成编译时同时匹配这2个update方法,无法确定具体调用哪个重载方法。
解决办法:
给个简单示例:
(javac无法编译通过)
(javac编译ok)
PS:eclipse的编译级别放的比较宽,有些unchecked的都直接给Pass掉了,这个能否在eclipse中设置,我没试过,你可以自行研究看看,但是通过javac编译不通过肯定是有问题滴...