2009-01-06 36 views
-2

我有几类,即:如何从多个扩展通用接口继承?

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不能编译,因为我还没有实现公共无效的onMessage(即时聊天)。我不明白为什么我必须实现onMessage(IMessage),因为它已经实现了onMessage(XMLStatusMessage),XMLStatusMessage是一个IMessage。有这个问题的简单解决方案吗?

回答

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 

    } 

} 

希望这是你想要的,它有帮助。

Registers 弯曲

+0

这是有道理的和工作!谢谢! – darrickc 2009-01-06 21:47:50

0

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

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

扩展它的XMLMessageListener定义了onMessage以接收至少一个XMLMessage。

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

0

XMLStatusMessage是一个IMessage,但不是相反的。如果有即时聊天的另一个子,说SMTPStatusMessage,则:

  1. 的onMessage(即时聊天)可以合法地交由一个SMTPStatusMessage,但
  2. 的onMessage(XMLStatusMessage)不能。

如果你不希望有比发送到AStatusHandler的XMLStatusMessage其他任何东西,那么你就可以拥有的onMessage(即时聊天)投了即时聊天到XMLStatusMessage和调用的onMessage(XMLStatusMessage),但是这不是一个伟大的长期战略。

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

1

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

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

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