我有一些由此界面生成的内容:
public interface Content {
void addListener(ContentListener<?> listener);
}
赞GenericContent
:
public interface GenericContent extends Content {
@Override
void addListener(GenericContentListener listener);
}
这些是ContentListener
和GenericContentListener
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}}具有相同的删除权,但不会覆盖它
如何使用不同的技术获得相同的效果?
答案 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);