Java 通过接口重写泛型方法

Java 通过接口重写泛型方法,java,generics,overriding,Java,Generics,Overriding,我有一些内容,由这个界面生成: public interface Content { void addListener(ContentListener<?> listener); } 它们是ContentListener和GenericContentListener public interface ContentListener<T extends Content> { void ping(T content); } public interface

我有一些内容,由这个界面生成:

public interface Content {
    void addListener(ContentListener<?> listener);
}
它们是
ContentListener
GenericContentListener

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

public interface GenericContentListener extends ContentListener<GenericContent> 
{
}
公共接口ContentListener{
空隙率(T含量);
}
公共接口GenericContentListener扩展ContentListener
{
}
我的问题是,方法
addListener
进入
GenericContent
是一个双重错误:

  • 类型为
    GenericContent
    的方法
    addListener(ContentListener)
    必须重写或实现超类型方法

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


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

尝试删除
@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> 
{
} 
目前,您的
内容
界面将允许添加任何类型的
内容
。此更改强制要求添加的
ContentListener
必须适用于该类型的
Content

然后,您可以更进一步,这样做:

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

public interface GenericContent extends Content<GenericContent, GenericContentListener> {

}

内容类不是泛型的-方法中的T是什么?应该是在内容中键入泛型是我的一个想法,但是,因为客户只会使用内容界面,所以警告很烦人,因为没有插入“”。但我认为这是唯一的办法…:\非常感谢。
public interface Content<T extends Content> {
  void addListener(ContentListener<T> listener);
}  

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

public interface GenericContent extends Content<GenericContent, GenericContentListener> {

}
void addListener(GenericContentListener listener);