2017-05-29 5 views
1

ジェネリックをオーバーライドする方法を確認しました。私のリポジトリに春のデータ。オーバーライド汎用インターフェースメソッド

<S extends T> S save(S var1); 

を::CrudRepository考えると私はオーバーライドすることができます

public interface ChannelDetailsRepository extends IgniteRepository<ChannelDetails, Long> { 
    @Override 
    default ChannelDetails save(ChannelDetails entity) { 
    throw new UnsupportedOperationException(); 
    } 
... 
} 

が、いくつかの例はまだ明らかではない。

<S extends T> Iterable<S> save(Iterable<S> var1); 

私が試した使用を(同じChannelDetailsRepositoryインタフェースに)

@Override 
default Iterable<ChannelDetails> save(Iterable<ChannelDetails> entities) { 
    throw new UnsupportedOperationException(); 
} 

私の試みは、コンパイルエラーで失敗しました:

Error:(28, 38) java: name clash: save(java.lang.Iterable<com.nextiva.calendar.entity.ChannelDetails>) in com.nextiva.calendar.dao.ignite.ChannelDetailsRepository and <S>save(java.lang.Iterable<S>) in org.springframework.data.repository.CrudRepository have the same erasure, yet neither overrides the other 
Error:(26, 5) java: method does not override or implement a method from a supertype 

と私は、この一般的なオーバーライドを修正するためにどのように何のアイデアを持っていません。

+2

: ' Sは、(S VAR1)保存'あなたのメソッドは 'T'を拡張_any_ 'S'のためではなく、 'T'を拡張し、いくつかの特定の' S'のために働くことになっていることを意味します。 'S'は、メソッドではなくクラスの型パラメータになるように移動する必要があります。 –

答えて

3

追加の型パラメータSは、Tというサブタイプを受け入れて返すように、それぞれChannelDetailsを保持する必要があります。要するに

@Override 
default <S extends ChannelDetails> Iterable<S> save(Iterable<S> entities) { 
    throw new UnsupportedOperationException(); 
} 
+0

@CinCoutあなたは答えられていない質問とは何を考えますか?私は「この一般的なオーバーライドを修正する方法はありません。」つまり、「エラーを修正して、メソッドがインタフェース内のメソッドを上書きするようにするにはどうすればよいですか? –

+0

@CinCoutは良いですか? –

関連する問題