public <S extends T> List<S> save(Iterable<S> entities) {
//...
}
如果我使用以下方法覆盖
@Override
public List<MyType> save(Iterable<MyType> structures) {
List<MyType> result = new ArrayList<>();
//...
return result;
}
我收到以下错误:
method does not override or implement a method from a supertype
name clash: save(Iterable<MyType>) in MyTypeRepositoryImpl and <S>save(Iterable<S>) in SimpleJpaRepository have the same erasure, yet neither overrides the other
where S,T are type-variables:
S extends T declared in method <S>save(Iterable<S>)
T extends Object declared in class SimpleJpaRepository
我该如何解决这个问题?我不需要该方法是通用的,实际上它不应该是通用的。我的意思是
@Override
public <S extends MyType> List<S> save(Iterable<S> structures) {
List<S> result = new ArrayList<>();
//...
return result;
}
将不起作用,因为该方法可以创建与 List 不“兼容”的 MyType 新对象。
我怎样才能使这项工作?
编辑:
为了澄清。我正在尝试覆盖 Spring 数据 SimpleJpaRepository 的不同 save() 方法(由 QuerydslJpaRepository 扩展)
类定义:
public class MyTypeRepositoryImpl
extends QueryDslJpaRepository<MyType, Long>
implements MyTypeRepository
@NoRepositoryBean
public interface MyTypeRepository
extends JpaRepository<MyType, Long>,
QueryDslPredicateExecutor<MyType>
而这个(来自 Spring Data)
public class QueryDslJpaRepository<T, ID extends Serializable>
extends SimpleJpaRepository<T, ID>
implements QueryDslPredicateExecutor<T>
编辑2:
该方法为每个元素调用 save(MyType entity) ,该方法包含以下逻辑:
- 实体有一个唯一的字段
- 获取该字段值并检查具有该值的实体是否已存在
- 如果是,则使用该实体(调用 entityManager.merge)-> 不起作用返回 MyType 而不是 S
- 如果没有,则创建一个新对象-> 此处创建新对象。不适用于泛型类型
对于 4. 我可以设置 id = null 并使用传入的对象。这对 3 不起作用。
所以我很疑惑为什么这个方法有这个签名。它使我无法使用它,我不明白为什么我会使用 Ts DAO 保存 T 的子类。保存方法是唯一带有 . 所有其他人都只使用 T。我可以将其转换为 S 以使其编译,但这看起来也很丑陋……因为除 T 之外的任何其他类型都会导致异常。