2017-05-29 77 views
1

我檢查瞭如何重寫泛型。考慮到CrudRepository我可以覆蓋:春季數據。覆蓋通用接口方法

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

在我的倉庫:

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)'意味着你的方法應該是對_any_'S'擴展'T',對某些特殊的'S'擴展'T'工作。您需要將'S'移動到類的類型參數中,而不是方法。 –

回答

3

您需要保留附加類型參數S,以便該方法分別接受並返回T的子類型ChannelDetails

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

@CinCout你認爲這個問題沒有得到答案?我拿着「我不知道如何解決這個通用重寫。」成爲問題,即「如何修復錯誤並使我的方法覆蓋界面中的方法?」 –

+0

@CinCout更好? –