如何从多个扩展通用接口继承?

时间:2009-01-06 20:46:41

标签: java generics inheritance

我有几个课程:

public class XMLStatusMessage extends XMLMessage
{}
public abstract class XMLMessage implements IMessage
{}

public interface IMessageListener
{
    public void onMessage( IMessage message );
}

public interface XMLMessageListener <T extends XMLMessage> extends 
    IMessageListener
{
    public void onMessage( T message ); 
}

public interface XMLStatusMessageListener extends 
    XMLMessageListener <XMLStatusMessage>
{
    @Override
    public void onMessage( XMLStatusMessage message );
}

public class AStatusHandler implements XMLStatusMessageListener
{
    //...
    @Override
    public void onMessage( XMLStatusMessage message )
    {
        //...
    }
}

我的问题是AStatusHandler不会编译,因为我还没有实现public void onMessage(IMessage)。我不明白为什么我必须实现onMessage(IMessage),因为它已经实现了onMessage(XMLStatusMessage),而XMLStatusMessage是一个IMessage。这个问题有一个简单的解决方案吗?

4 个答案:

答案 0 :(得分:2)

正如其他答案所指出的那样,你只能在AStatusHandler中处理XMLStatusMessage消息,但我猜这是你想要的吗?按照以下方式重新声明您的界面,我相信您会得到您想要的东西;

public interface IMessageListener<T extends IMessage> {

    public void onMessage(T message);
}

public interface XMLMessageListener<T extends XMLMessage> extends IMessageListener<T> {
}

public interface XMLStatusMessageListener extends XMLMessageListener<XMLStatusMessage> {
}

然后您可以按如下方式创建消息监听器;

public class AStatusHandler implements XMLStatusMessageListener {

    @Override
    public void onMessage(final XMLStatusMessage message) {

        // TODO Auto-generated method stub

    }

}

希望这是你想要的,而且它会有所帮助。

此致 弯曲

答案 1 :(得分:1)

您声明(通过实现IMessageListener)您可以使用任何 IMessage调用onMessage。如果你打电话,你会发生什么:

new XMLMessageListener().onMessage(new SomeOtherMessage());

?如果您认为不应该允许,则不应该实现IMessageListener。

答案 2 :(得分:0)

我以前一直在这些情况下,但这个问题并没有真正的解决方案。

在您的情况下,IMessageListener将onMessage定义为接收IMessage。

扩展它的XMLMessageListener将onMessage定义为至少接收XMLMessage。

即使您忽略了泛型,Java也不允许您在方法的重写版本中更改参数类型。因此,这两个方法被认为是重载,并且您的代码无法编译,因为您没有接收IMessage的版本的定义。

答案 3 :(得分:0)

XMLStatusMessage是一个IMessage,但不是相反的。如果有另一个IMessage的子类,比如说SMTPStatusMessage,那么:

  1. onMessage(IMessage)可以合法地交给SMTPStatusMessage,但是
  2. onMessage(XMLStatusMessage)无法。
  3. 如果您不希望除了向AStatusHandler发送XMLStatusMessage之外的任何内容,那么您可以让onMessage(IMessage)将IMessage转换为XMLStatusMessage并调用onMessage(XMLStatusMessage),但这不是一个很好的长期策略。 / p> 编辑:真的,问题是为什么XMLMessageListener根本就是IMessageListener的子类,因为可能调用onMessage(XMLStatusMessage)的类永远不会调用onMessage(IMessage)?