0

尽管我将此问题标记为 Morphia 问题,但我认为它更笼统,但无论如何,感谢您的帮助。

我有IUser界面,我无法控制它:

public interface IUser<T> {
    ...
    public String getFirstName();
    ...
}

我也有这个接口的实现用户(Morphia 实体):

@Entity
public class User implements IUser<ObjectId> {
    @Id
    private ObjectId id;

    @Property
    private String firstName;

    public String getFirstName() {
        return this.firstName;
    }
    ...
}

当 Morphia 要求映射类时,我提供 User.class,因为这是 Morphia 实体。因此,当我扩展 BasicDAO 时,我提供UserObjectId作为类型:

public class UserDAO extends MongoDAO<User, ObjectId> {
    public List<IUser<ObjectId>> getUsers(String id) {
        return ds.find(IUser.class, Mapper.ID_KEY, new ObjectId(id)).asList(); 
    }
}

现在,问题出现在getUsers方法中。如您所见,我想继续使用这个类之外的接口;这就是为什么我期望List<IUser<ObjectId>>作为返回类型。

ds.find(...)方法的第一个参数是一个Class<T>类型,所以我提供了 IUser.class。但是,正因为如此,我不能再期待List<IUser<ObjectId>>结果了,只是List<IUser>。这样,我就失去了 IUser 的类型。是否有可能强制此 Morphia 的方法返回参数化 IUser 对象的列表?

提前谢谢你,兹拉特科

4

1 回答 1

0

有几个选项。

Guava、Guice 和类似库所做的是接受一个TypeToken利用匿名内部类来具体化类型的 a。它看起来像这样:

return ds.find(new TypeToken<IUser<ObjectId>>(){}, ...);

但显然这不是一个真正的选择,因为您无法更改库。然而,这是我认为正确的解决方案。

第二个选项是只强制转换类以包含泛型参数。这会导致未经检查的警告,但是需要抑制或忽略该警告:

@SuppressWarnings({"unchecked"}) 
Class<IUser<ObjectId>> userClass = (Class<IUser<ObjectId>>) (Object) IUser.class;
return ds.find(userClass, ...);

编辑:

应该真正注意的是,上面的建议实际上并不比在返回之前将整个列表从 aList<IUser>转换为 a更好。List<IUser<ObjectID>>两者都需要抑制警告。

于 2012-09-09T20:09:23.050 回答