6

(Ektorpライブラリの)コンストラクターを使用して次のクラスを拡張しようとしています。

public class CouchDbRepositorySupport<T extends CouchDbDocument> implements GenericRepository<T> {

...

protected CouchDbRepositorySupport(Class<T> type, CouchDbConnector db) {
...

}

これが私の実装です:

public class OrderRepository extends CouchDbRepositorySupport<Order<MenuItem>> {

    public OrderRepository(CouchDbConnector db) {
        super(Order<MenuItem>.class, db);

問題はOrder<MenuItem>.class部品にあります。Javaコンパイラは私にこう教えてくれます:

 Syntax error on token ">", void expected after this 

私はで試してみましたが(Order<MenuItem>).class、幸運はありませんでしたOrder.classnew Order<MenuItem>().getClass()

ジェネリッククラスの.class属性を取得するにはどうすればよいですか?

4

2 に答える 2

2

正しい構文は次のとおりです。

Order.class

Javaでは、Order<MenuItem>.class実行時Order.class同じクラスであり、型消去<MenuItem>のために実行時にジェネリック型情報(typeパラメーター)が失われます。これは、Javaのジェネリック型システムの重大な制限です。

于 2012-05-15T20:08:32.533 に答える
1

タイプを変更して内部タイプを公開すると、次のように取得できます。

public class CouchDbRepositorySupport<C, T extends CouchDbRepositorySupport<C>> implements GenericRepository<T> {
...

    protected CouchDbRepositorySupport(Class<C> type, CouchDbConnector db) {
        ...
    }

public class OrderRepository extends CouchDbRepositorySupport<MenuItem, Order<MenuItem>> {

    public OrderRepository(CouchDbConnector db) {
        super(MenuItem.class, db);

親クラスを宣言する方法については、いくつかの選択肢があります。これはほんの一例です。

免責事項:IDEを使用せずに手動でこれを行ったため、構文上の小さな問題がいくつか発生する可能性がありますが、概念は機能するはずです。

于 2012-05-16T02:39:28.603 に答える