0

この質問を Morphia の問題としてタグ付けしましたが、より一般的なものだと思いますが、とにかく助けていただければ幸いです。

私はそれを制御できないIUserインターフェイスを持っています:

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

また、このインターフェースのUser (Morphia エンティティ) を実装しています。

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

    @Property
    private String firstName;

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

Morphia がクラスのマッピングを要求した場合、これが Morphia エンティティであるため、User.class を提供します。したがって、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(...)メソッドの第 1 引数は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>>(){}, ...);

しかし、ライブラリを変更することはできないため、ここでは明らかにそれは実際のオプションではありません。しかし、それは私が正しい解決策であると考えるものです。

2 番目のオプションは、ジェネリック パラメーターを含むようにクラスをキャストすることです。これにより、チェックされていない警告が表示されますが、抑制または無視する必要があります。

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

編集:

List<IUser>上記の提案は、リスト全体を a からa にキャストしてList<IUser<ObjectID>>から返すよりも優れているわけではないことに注意してください。どちらも、警告を抑制する必要性は同じです。

于 2012-09-09T20:09:23.050 に答える