2009-01-06 3 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) 
    { 
     //... 
    } 
} 

내 문제는 내가 공공 무효의 onMessage (iMessage를)을 구현하고 있지 않다 때문에 AStatusHandler 컴파일되지 것입니다. 왜 내가 onMessage (IMessage)를 구현해야하는지 모르겠다. 이미 onMessage (XMLStatusMessage)를 구현하고 XMLStatusMessage는 IMessage이다. 이 문제에 대한 간단한 해결책이 있습니까?

답변

2

다른 답변에서 지적한대로 XMLStatusMessage 메시지는 AStatusHandler에서만 처리 할 수 ​​있지만 내 생각 엔 이것이 원하는 것입니까? 다음과 같이 인터페이스를 재 선언하면 원하는 것을 얻을 수 있다고 믿습니다.

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 

    } 

} 

희망은 이것이 당신이 원하는 것이며 그것이 도움이되기를 바랍니다.

감사합니다. 굴곡부

+0

이것은 의미 있고 효과적입니다! 감사! – darrickc

0

나는 이런 상황에 처해 있었지만 실제로는이 문제에 대한 아름다운 해결책은 없다.

IMessageListener는 IMessage를 수신하기 위해 onMessage를 정의합니다.

XMLMessageListener는 XMLMessage를 수신하도록 onMessage를 정의합니다.

제네릭을 무시한 경우에도 Java는 메소드의 재정의 버전에서 매개 변수 유형을 변경할 수 없습니다. 따라서 IMessage를받는 버전에 대한 정의가 없으므로 두 가지 메서드가 오버로드로 간주되어 코드가 컴파일되지 않습니다.

0

XMLStatusMessage는 IMessage이지만 그 반대는 아닙니다.

  1. 의 onMessage (iMessage를) 합법적으로 SMTPStatusMessage를 건네 될 수 있지만,
  2. 의 onMessage (XMLStatusMessage가) 없습니다 : iMessage를 다른 서브 클래스가 있었다면, 다음 SMTPStatusMessage을 말한다. 당신이 AStatusHandler에 보낸 XMLStatusMessage 이외의 아무것도 기대하지 않는 경우

, 당신은의 onMessage (iMessage를)의 XMLStatusMessage에 iMessage를 캐스팅이와의 onMessage (XMLStatusMessage)를 호출,하지만 좋은 장기 아니라 수 병법.

EDIT : 실제로 XMLMessageListener가 IMessageListener의 서브 클래스 인 이유는 onMessage (XMLStatusMessage)를 호출하는 클래스가 onMessage (IMessage)를 호출하지 않을 것이기 때문입니다.

1

IMessageListener를 구현하여 과 함께 IMessage를 호출 할 수 있다고 주장하고 있습니다. 전화를 걸면 어떤 일이 발생할 것으로 예상됩니까?

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

? 허용되어서는 안된다고 생각되면 IMessageListener를 구현하면 안됩니다.

관련 문제