2

我有一些内容,由这个接口生成:

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> 
{
}

我的问题是方法addListenerintoGenericContent是一个双重错误:

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

  • 名称冲突:类型的方法addListener(ContentListener<GenericContent>)与类型GenericContent具有相同的擦除addListener(ContentListener<?>)Content不覆盖它

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

4

1 回答 1

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任何类型的a Content。此更改强制ContentListener添加的必须是Contentthis 的类型。

然后,您可能会更进一步并执行以下操作:

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);
于 2013-05-26T10:57:21.587 回答