gpt4 book ai didi

java - 在方法参数中扩展泛型

转载 作者:行者123 更新时间:2023-11-29 06:09:52 24 4
gpt4 key购买 nike

我正在尝试扩展一个在实体和实体管理器中使用泛型的库,所以我有以下内容:

public class MyEntity extends ParentEntity extends BaseEntity

public class MyEntityManager extends ParentEntityManager extends BaseEntityManager<ParentEntity, ParentEntityDao>

现在我的问题是,我正在使用库的另一个类来更新实体,我需要调用的方法是:

public <ENT extends BaseEntity> void update (Class<ENT> entityClass, BaseEntityManager<ENT> entityManager)

因此,当我尝试使用 MyEntityMyEntityManager 调用该方法时,它失败了,因为我的 EntityManager 扩展自 BaseEntityManagerParentEntity 作为参数,而不是 MyEntity,因此它们不匹配。

我想说解决这个问题的最干净的方法是复制具有更新方法的实用程序类并在我的项目中扩展它,但我想让它成为通用的,这样我就可以将它传递给使用任何子项的 EntityManagers ParentEntity 的类,但我已经尝试了一段时间,但找不到解决方案。

我尝试将方法签名更改为:

public <ENT extends BaseEntity> void update (Class<ENT> entityClass, BaseEntityManager<? extends ENT> entityManager)

但我仍然遇到编译器异常...

编辑:修改 ParentEntityManager、BaseEntityManager 或 ParentEntity 是不可能的,因为对这些类的依赖太多

最佳答案

由于它没有出现,您可以轻松解决我会使用变通方法的问题。您可以使用类型删除。

update((Class) MyEntity.class, myEntityManager);

这将编译并带有警告。警告是有效的恕我直言,因为您的类结构不完全合乎逻辑;)如果需要,您可以禁止显示此警告。


我所做的是;容器类返回它包含/管理的对象的类型。

class BaseEntityManager<E> {
private final Class<E> typeManaged;
public Class<E> typeManaged() { return typeManaged; }
}

// remove duplicate class parameter
public <ENT extends BaseEntity> void update (BaseEntityManager<ENT> entityManager)

管理器知道它管理的是什么类型,update() 方法可以通过调用 typeManaged() 来询问它。这避免了必须提供匹配类型或检查此类型。


你的问题是

MyEntityManager extends BaseEntityManager<ParentEntity>

这意味着您必须提供的类是 ParentEntity.class 而不是 MyEntity.class。

看来真正的解决办法是你需要改变

MyEntityManager extends BaseEntityManager<MyEntity>

恕我直言,这会更符合逻辑并解决您的问题。

关于java - 在方法参数中扩展泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7305829/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com