Java 如何从多个扩展泛型接口继承?

Java 如何从多个扩展泛型接口继承?,java,generics,inheritance,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 ex

我有几门课是这样的:

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 );
}

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

我以前遇到过这种情况,但这个问题并没有一个很好的解决办法

在您的情况下,IMessageListener定义onMessage来接收IMessage

您的XMLMessageListener扩展了它,它定义onMessage以至少接收一条XMLMessage


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

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

  • onMessage(IMessage)可以合法地传递SMTPStatusMessage,但是
  • 无法创建onMessage(XMLStatusMessage)
  • 如果您不希望将XMLStatusMessage以外的任何内容发送给AStatusHandler,那么可以让onMessage(IMessage)将IMessage转换为XMLStatusMessage并调用onMessage(XMLStatusMessage),但这不是一个很好的长期策略

    编辑:真的,问题是为什么XMLMessageListener是IMessageListener的子类,因为调用onMessage(XMLStatusMessage)的类可能永远不会调用onMessage(IMessage)?

    您声称(通过实现IMessageListener),您可以使用任何IMessage调用onMessage。如果您打电话给:

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

    ??如果您认为这是不允许的,那么就不应该实现IMessageListener。

    正如其他答案所指出的,您将只能在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 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
    
        }
    
    }