2
public abstract class BaseDaoImpl<E extends AbstractEntity> implements BaseDao<E> {

    .....

    public BaseDaoImpl() throws DataAccessException {
        logger = LoggerFactory.getLogger(E);  <<-- error here.
    }

上記のコードでは、の呼び出しでエラーが発生しますgetLogger(E)

Eを変数に解決できません

これは理にかなっていますが、getLogger(E.class)(またはその変形)も機能しません。

コンストラクターでリテラルクラスを渡したくないので、コンストラクターヘッダーを:に変更するようなソリューション
public BaseDaoImpl(Class<E> clazz) ...はオプションではありません。

からクラスタイプを取得するにはどうすればよいEですか?

次の答えに注意してください:ジェネリック型のパラメータがない場合にそのクラスを取得するにはどうすればよいですか?
助けないでください。

4

4 に答える 4

6

Eコンストラクターを変更しないと、実行時に、静的にまだ知らなかったことについて何も学ぶことができません。これは、Javaでは、ジェネリックパラメーターの実行時の影響がまったくないためです。コンパイラーはE、生成するコード内のすべての参照を文字通り消去します。したがって、型パラメーターがインスタンス化されているクラスを判別できるコードが必要な場合は、ある種の引数(Classオブジェクトなど)を自分で追加する必要があります。それを回避する方法はありません。

于 2013-03-13T16:23:02.830 に答える
2

@CorayThanが指摘しているように、リフレクションによって可能です。それを行う簡単な方法は、メソッドシグネチャからです

interface BaseDao<E>
    E find(long id);

class FooDao implements BaseDao<Foo>
    Foo find(long id)

したがって、タイプEは

this.getClass().getDeclaredMethod("find", long.class).getReturnType();

ただし、コンストラクターでaを渡すこと非常に良いオプションです。Classコンストラクターはユーザーコードによって呼び出されることを意図していないため、ここでは冗長性は問題になりません。

abstract class BaseDaoImpl<E>

    BaseDaoImpl(Class<E> clazz)

class FooDao extends BaseBaoImpl<Foo>

    FooDao()
        super(Foo.class);

// usages:

BaseDao<Foo> fooDao = new FooDao(); // clean & simple API
于 2013-03-13T16:43:59.083 に答える
0

ジェネリックスは型消去を使用してJava言語で実装されているため、実行時型情報を必要とするようなことはできません。詳細については、このページを参照してください。

于 2013-03-13T16:34:07.567 に答える
-1

すでに回答済みです。

基本的には、リフレクションを使わないとできません。

リフレクションの使用はお勧めしませんが、必要に応じて、次を使用できるようにする必要があります。

GenericClass.class.getTypeParameters()
于 2013-03-13T16:34:21.400 に答える