2013-12-14 27 views
5

クラス "ClassA"のインスタンスであるが、インターフェイス "InterfaceI"も実装するクラスに変数を設定する必要があります。クラスAを拡張していくつかのインターフェイスを実装する必要があるメンバ変数

private ClassA mVariable; 
private InterfaceI mVaraible; 

のが、どのように私は両方ともにClassAを拡張し、InterfaceBを実装するオブジェクトを強制することができます

明らかにこれは簡単にどちらか一方のために行うことができますか?次のようなものがあります。

private <? extends ClassA & InterfaceI> mVaraible; 

私が必要とするものですが、それが可能なのかどうかはわかりません。 (と思う?)私はまた、getおよびsetメソッドが必要になりますが、それはジェネリックで行うことができます

明白な解決策は

public class ClassB extends ClassA implements InterfaceI{ 
    //whatever here 
} 

あるしかしInterfaceIとにClassAの両方が外部libaryの一部であり、このlibaryにはClassAとInterfaceIを拡張するクラスがあり、ClassBを拡張するようにそれらを編集することはできません。したがって、この解決法は機能しません。

+1

あなたがすることはできません、基本的に。変数を設定するときにチェックし、必要なときにキャストできますが、変数自体にその制約を表すことはできません。 –

+0

Java8には、複数の継承や何らかの混在を可能にする魔法があります。 – Thufir

+0

@Jon Skeet変数を設定するときにどうやってチェックしますか? – jtedit

答えて

1

私はかなりハッキリな回避策を見つけました。

次のようにクラスの両方にClassAとInterfaceIの参照を含む:

private ClassA mItemClassA; 
private InterfaceI mItemInterfaceI; 

設定方法は、このようになります。この

public void setVaraible(ClassA item){ 
    assert (item instanceof InterfaceI); 
    mItemClassA = item; 
    mItemInterfaceI = (InterfaceI) item; 
} 

他のバリエーションがfalseを返すと、例外をスローすることができ等が含まれている場合、そのアイテムがInterfaceIのインスタンスでない場合

クラス内の他のメソッドは、mItemClassAを使用してInterfaceIとClassAの両方から関数を呼び出すことができますnd mItemInterfaceI。

私は今のところgetメソッドを実装するつもりはありませんが、私がした場合は、インターフェイスを取得するバージョンとクラスを取得するバージョンが必要になる可能性があります。

+0

代わりに例外を使います。アサーションはデフォルトではチェックされません。それはあなたがオンにしなければならない余分な旗です。 +1 btw。 –

0

あなたは、このような一般的クラス型でこれを行うことができます。

private class ClassB <R extends ClassA & InterfaceI> { 
    R mVaraible; 
} 
関連する問題