java泛型:形式类型“?extended MyClass”不能用于调用“ T get(Class <T> aClass)

时间:2019-10-14 14:07:15

标签: java generics

我有一个类似的类层次结构(简化):

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 参数的类型“ Class <?extended MemoOwner>”。 IMO,我想要的调用在运行时也是安全的,因为

  • 休眠使用给定的类(运行时动态)使实体无效化
  • 实例化的类始终是MemoOwner(编译时泛型)类型的后代,并且可以分配给我的业务方法的返回值。

为什么编译器不接受这种通用类型?

0 个答案:

没有答案