我有几个课程:
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。这个问题有一个简单的解决方案吗?
答案 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,那么:
如果您不希望除了向AStatusHandler发送XMLStatusMessage之外的任何内容,那么您可以让onMessage(IMessage)将IMessage转换为XMLStatusMessage并调用onMessage(XMLStatusMessage),但这不是一个很好的长期策略。 / p> 编辑:真的,问题是为什么XMLMessageListener根本就是IMessageListener的子类,因为可能调用onMessage(XMLStatusMessage)的类永远不会调用onMessage(IMessage)?