- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试扩展一个在实体和实体管理器中使用泛型的库,所以我有以下内容:
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)
因此,当我尝试使用 MyEntity
和 MyEntityManager
调用该方法时,它失败了,因为我的 EntityManager
扩展自 BaseEntityManager
将 ParentEntity
作为参数,而不是 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/
我是一名优秀的程序员,十分优秀!