我正在尝试创建Spring类CrudRepository的Mock实现,但我找不到如何实现此方法:
public <S extends T> Iterable<S> save(Iterable<S> iterable)
例如,我有这个:
private class CrudRepositoryMock implements CrudRepository<String, String> {
// works fine, the method is correctly overridden
// method signature in interface : public <S extends T> S save(S s)
@Override
public String save(String s) {
return null;
}
// does not work, IntelliJ tells me that the method does not override
// from the superclass
// method signature in interface :
// <S extends T> Iterable<S> save(Iterable<S> iterable)
@Override
public Iterable<String> save(Iterable<String> iterable) {
return null;
}
}
成功覆盖其他方法。我只是不知道我应该写什么来正确覆盖使用Iterable的方法。
有什么想法吗?
谢谢。
答案 0 :(得分:1)
请注意,S是由方法声明的类型参数,因此Iterable<S extends String>
不是Iterable<String>
,一个允许String的子类型(这不是一个很好的例子),后者不是,< / p>
符合界面的正确覆盖将是
@Override
public <S extends String> Iterable<S> save(Iterable<S> iterable) {
...
}
答案 1 :(得分:0)
这是因为由于参数为S extends T
,Iterable
需要S extends String
,而String
还不够。
请注意:如果MyString extends String
,您应该被允许致电save(Iterable<MyString>)
并返回Iterable<MyString>
,这与Iterable<String>
不兼容。
您需要保留通用S
:
@Override
public <S extends String> Iterable<S> save(Iterable<S> iterable) {
return null;
}
答案 2 :(得分:0)
使用Eclipse IDE&#34;覆盖/实施方法&#34;快捷方式,我得到
@Override
public <S extends String> Iterable<S> save(Iterable<S> iterable) {
// TODO Auto-generated method stub
return null;
}
然而,这会产生警告;即,String
是最终的,不能延长。您可以传入String
对象,但按惯例final
类不应该由泛型使用。