通过接口覆盖泛型方法

时间:2013-05-26 10:31:51

标签: java generics override

我有一些由此界面生成的内容:

public interface Content {
    void addListener(ContentListener<?> listener);
}

GenericContent

public interface GenericContent extends Content {
    @Override
    void addListener(GenericContentListener listener);
}

这些是ContentListenerGenericContentListener

public interface ContentListener<T extends Content> {
    void ping(T content);
}

public interface GenericContentListener extends ContentListener<GenericContent> 
{
}

我的问题是方法addListener进入GenericContent是一个双重错误:

  • 类型addListener(ContentListener<GenericContent>)的方法GenericContent必须覆盖或实现超类型方法

  • 名称冲突:addListener(ContentListener<GenericContent>)类型的方法GenericContent与类型addListener(ContentListener<?>)的{​​{1}}具有相同的删除权,但不会覆盖它

    < / LI>

如何使用不同的技术获得相同的效果?

1 个答案:

答案 0 :(得分:2)

尝试删除@Override注释。通常,您在类中使用@Override而不是接口,使用它来告诉您此方法必须覆盖另一个,如果它失败(如果超类方法签名更改),则编译错误是抛出。这样做可以为我编译。我还对结构进行了一次调整:

public interface Content {
  void addListener(ContentListener<? extends Content> listener);
}  

public interface GenericContent extends Content {
  void addListener(GenericContentListener listener);
}

public interface ContentListener<T extends Content> {
  void ping(T content);
}

public interface GenericContentListener extends ContentListener<GenericContent> 
{
} 

现在除此之外,您可以考虑重新定义Content,然后再考虑GenericContent,如下所示:

public interface Content<T extends Content> {
  void addListener(ContentListener<T> listener);
}  

public interface GenericContent extends Content<GenericContent> {
  void addListener(GenericContentListener listener);
}

目前,您的Content界面将允许添加ContentListener任意类型的Content。此更改强制添加的ContentListener必须是Content的类型。

然后,你可以更进一步,做到这一点:

public interface Content<T extends Content, L extends ContentListener<T>> {
  void addListener(L listener);
}  

public interface GenericContent extends Content<GenericContent, GenericContentListener> {

}

现在有人实施GenericContent时,假设addListener方法签名为:

void addListener(GenericContentListener listener);