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(QuerydslJpaRepositoryによって拡張される)のさまざまなsave()メソッドをオーバーライドしようとしています
クラスの定義:
public class MyTypeRepositoryImpl
extends QueryDslJpaRepository<MyType, Long>
implements MyTypeRepository
@NoRepositoryBean
public interface MyTypeRepository
extends JpaRepository<MyType, Long>,
QueryDslPredicateExecutor<MyType>
そしてこれ(SpringDataから)
public class QueryDslJpaRepository<T, ID extends Serializable>
extends SimpleJpaRepository<T, ID>
implements QueryDslPredicateExecutor<T>
編集2:
このメソッドは各要素に対してsave(MyTypeエンティティ)を呼び出し、そのメソッドには次のロジックが含まれています。
- エンティティには一意のフィールドがあります
- そのフィールドの値を取得し、その値を持つエンティティがすでに存在するかどうかを確認します
- はいの場合、そのエンティティを使用します(entityManager.mergeを呼び出します)->機能しませんSではなくMyTypeを返します
- 新しいオブジェクトを作成しない場合->ここで新しいオブジェクトが作成されます。ジェネリック型では機能しません
4.の場合、id = nullを設定して、渡されたオブジェクトを使用できます。それは3では機能しません。
したがって、このメソッドにこのシグネチャがある理由には非常に戸惑います。それは私にとってそれを使用できなくし、TsDAOを使用してTのサブクラスを保存する理由がわかりません。が付いているのはsaveメソッドだけです。他のすべてはTを使用します。コンパイルするためにSにキャストすることもできますが、それも醜いようです...T以外のタイプは例外につながるためです。