2016-11-28 24 views
0

に私は、Javaのインターフェイスを持っている:方法で、一般的なパラメータで定義される一般的な復帰方法

public interface IElement{ 

    public String getId(); 
    public String getName(); 

    /*** 
    * adds an IElement to this elements children 
    * @param child 
    */ 
    void getAddChild(IElement child); 

    /*** 
    * returns all children 
    * @return 
    */ 
    Collection<IElement> getChildren(); 

    /*** 
    * returns all children which match the Class of the passed IElement 
    * @param eType - the class type to match 
    */ 
    Collection<IElement> getChildren(Class<? extends IElement> eType); 
} 

アイデアはIElementが、他のIElementのコレクションが含まれていてもよいということです。

一致する兄弟のコレクションを返すには、Collection<IElement> getChildren(Class<? extends IElement> eType)メソッドが必要です。

私はすべてがIElementを拡張する3つのクラスを持っていたと言います。 一つRoomと呼ばれていた、 他はBoxbox1box2box3)と呼ばれていた、 、別のは、私は次の操作を行うことができますRoomのインスタンスに今

Shelveshelve1

と呼ばれていました:

room1.addChildren(box1); 
room1.addChildren(box2); 
room1.addChildren(shelve1,sheleve2); 
room1.addChildren(box3); 

今私はそれに3つの異なるボックスとShelveshelve1)とRoomroom1)があります。 Boxのオブジェクトは、Collection<IElement> getChildren(Class<? extends IElement> eType);メソッド を使用してroom1.getChildren(Box.class)のようにroom1のすべてのオブジェクトを取得したいと考えています。ただし、メソッドはIElementのコレクションのみを返します。私はそれがCollection<Box>を返すことを望みます。 Shelveを渡した場合は、Shelveオブジェクトのコレクションを返す必要があります。

これは可能ですか?もしそうなら、あなたはどうやってそれをしますか? これは奇妙に思えますが、私は他のすべての要素を保持できる多くのオブジェクトを持っています。さまざまな種類のフィルタリングをすばやく簡単に行う必要があります。

+0

あなたの 'getChildren'メソッドは、名前付きジェネリック型を持つ必要があります。例えば'コレクション getChildren(クラス eType)'。 – khelwood

答えて

0

ワイルドカードを使用するのではなく、名前付きジェネリック型で汎用メソッドを宣言できます。

<E extends IElement> Collection<E> getChildren(Class<E> eType); 

こうすることで、あなたが出て、コレクションのジェネリック型を使用すると、渡されたクラスと一致します。

あなたの実装では、引数のために適切なジェネリック型のコレクションを構築し、返却する必要があります。

+0

それは治療を働く!私はそれが何をしているかを静かではないが、私はそれを見るだろう。 –

+0

申し訳ありません。感謝万円! –

関連する問題