2016-09-10 14 views
1

一般的なメッセージングシステムを実装しようとしています。デスティネーションに応じて、クラスはサーバによって正しくデシリアライズされるために異なるインタフェースを実装する必要があります。Javaのジェネリックインターフェイスを拡張する汎用の汎用クラスを正しく作成する方法

public interface IBasicInput 
public interface IBasicOutput 
public interface IMessage <I,O> 

とクラスの実装:

このため

私はこれらのインターフェースを持っている

public class BasicInput1 implements IBasicInput 
public class BasicOutput1 implements IBasicOutput 
public class Type1Message<I extends IBasicInput,O extends IBasicOutput> implements IMessage<I, O> { 

    /** 
    * @Override from IMessage 
    */ 
    public void setIput(I input) { 

    } 

    /** 
    * @Override from IMessage 
    */ 
    public O getResult() { 
     return null; 
    } 

} 
このメッセージの目的は、実装でなければなりませんIMessageがおよび入力クラスを実装するメッセージを持つことである

IBasicInputの出力と出力はIBasicOutputの実装

このクラスをインスタンス化するとき

Type mismatch: cannot convert from Type1Message to IMessage

私は理由を理解カント:

IMessage<IBasicInput,IBasicOutput> message = new Type1Message<BasicInput1,BasicOutput1>(); 
私はこのエラーを得ました。 Type1MessageはIMessageを実装し、BasicInputとBasicOutputは両方とも署名インタフェースを実装します。

しかし、代わりにクラスを使用すると、インターフェイスは正常に動作します。 IMessage message = new Type1Message();

ありがとうございます!

答えて

0

Generics types are not inherited.はそれをコンパイルするには:そのrestrictionsを持って

IMessage<? extends IBasicInput, ? extends IBasicOutput> message = 
    new Type1Message<BasicInput1, BasicOutput1>(); 

ので、私は書きたいように:

IMessage<IBasicInput, IBasicOutput> message = new Type1Message<>(); 
関連する問題