我有一个类似的类层次结构(简化):
Identifiable <- MemoOwner <- Antrag
其中-BTW-代表数据库实体。
我有一个通用方法,可以通过ID(由休眠完成)获取安全的实体类型:
public <T extends Identifiable> T getById(Class<T> clazz, Number id)
{
return (T) getSession().get(clazz, id);
}
在业务层中,我有以下方法:
public MemoOwner loadMemoOwner(final int aId, final FinanzhilfeType aType)
{
Class<? extends MemoOwner> clazz = aType.getMemoOwnerClazz();
...
}
给定的FinanzhilfeType是一个枚举,其关联成员“ MemoOwnerClazz”的类型为Class <?扩展MemoOwner>。根据类型的不同,最终的实体类可能会有所不同。
我想调用我的通用方法(替换三个点以上):
return myLoggingDbService.getById(clazz, aId);
但是eclipse编译器抱怨:
The method getById(Class<T>, Number) in the type PersistenceService is not applicable for the arguments (Class<capture#2-of ? extends MemoOwner>, int)
我通过使用if-cascade克服了这种情况:
if ( clazz == Antrag.class )
{
return myLoggingDbService.getById(Antrag.class, aId);
}
if ( clazz == Vereinbarung.class )
{
return myLoggingDbService.getById(Vereinbarung.class, aId);
}
....
这不是真正令人满意的,因为它不是通用的。
我知道java泛型是编译时构造。但是我不明白为什么编译器不接受正式的Class
为什么编译器不接受这种通用类型?