GenericDaoImpl
は抽象的であり、すべての実際の実装はT
とK
バインドされている場合は、あなたはリフレクションを使用して型パラメータの値を取得できます。
abstract class GenericDaoImpl<K, T> {
public T get(K id) {
Class<?> valueClazz = (Class) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
return super.getHibernateTemplate().get(valueClazz, id);
}
}
class StringDao extends GenericDaoImpl<Integer, String> {
}
私はideoneでわずかに変更された例を作成し、型クラス、この場合はStringを出力するだけです。
これは、StringDao
(および他のすべてのDAO)がGenericDaoImpl
の直接サブクラスである場合にのみ機能するため、少し脆いです。そして、私が言ったように、GenericDaoImplが抽象ではなく直接使用されることを意図しているなら、それはうまくいかないでしょう。その場合、あなたがしていることが正しいアプローチであるかどうかを検討するべきだと思います。私の経験では、そのように一般的なDAOはうまく動作しません。
ので:Tは右(クラスタイプ、K ID)を取得しますか? SomeEntityDaoImplがGenericDaoを実装すると、getコールは「悪い」と表示されます。これを解決するには、を取得しますか? –
Blankman
@Blankmanコンパイラは 'type'引数から型パラメータを推論するので、呼び出し側は明示的にそれを提供する必要はありません。 – Taymon