如何使用<s extends =“”t =“”> Iterable <s>实现接口方法

时间:2016-05-19 20:36:25

标签: java

我正在尝试创建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的方法。

有什么想法吗?

谢谢。

3 个答案:

答案 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 TIterable需要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类不应该由泛型使用。