2016-05-07 7 views
1

私は、インタフェースとして「MyCollection」を持っています。addAllとcontainsAllの2つのメソッドだけで、パラメータとしてジェネリックコレクションをとります。どのようにしてこれらのメソッドをクラス内に効果的に実装して、どのタイプのコレクションでも動作させることができます。 これは私がこれまで何をやったかである:自分のジェネリックコレクションをJavaでどのように実装できますか?

インタフェース:

interface MyCollection<T extends Collection> { 
    boolean containsAll(T c); 
    boolean addAll(T c); 
} 
私はメソッドを実装

私のクラス:

public class MyPersonalCollection<E extends Collection> implements MyCollection { 
     private E myCollection; 

     public MyPersonalCollection(E myCollection) { 
      this.myCollection = myCollection; 
     } 

     public boolean containsAll(Collection c) { 
      return myCollection != null && myCollection.containsAll(c); 
     } 

     public boolean addAll(Collection c) { 
      return myCollection != null && myCollection.addAll(c); 
     } 
    } 

やテスト:

@Test 
    public void testIfNewCollectionCanBeAdded() { 
     ArrayList<String> input = new ArrayList<>(); 
     MyPersonalCollection<ArrayList<String>> myCollection = new MyPersonalCollection<>(input); 

     input.add("first"); 
     input.add("secon"); 
     input.add("third"); 

     assertTrue(myCollection.addAll(input)); 
    } 

    @Test 
    public void testIfMyCollectionContainsAnotherCollection() { 
     LinkedList<String> list = new LinkedList<>(); 
     MyPersonalCollection<LinkedList<String>> myCollection = new MyPersonalCollection<>(list); 

     list.add("bacon"); 
     list.add("tuna"); 
     list.add("steak"); 
     assertTrue(myCollection.addAll(list)); 
    } 

私も警告が表示されます:未処理の 'containsAll(Collection)'の生の型のメンバーとしてのJava.Util.Colle私のクラスでcontainsAll()メソッドとaddAll()メソッドを呼び出すと、 "ction"が返されます。 どうすればこの問題に取り組むことができますか?事前に多くの感謝!

+0

ここ命名混乱を示唆しています。 Collectionを実装していない場合は、Collectionを使用する型を実装しています。さらに、 'Collection'は既にあなたが定義した二つのメソッドを持っています...おそらく、それ自身のコレクションではなく、コレクションの周りにユーティリティメソッドを構築しています。また、あなたのメソッドのシグネチャでは、現在、 'Set 'を 'List 'に追加することができることに注意してください。 – GPI

+0

@Gustavo私の答えをご覧ください。私はそれがあなたの問題を解決すると思う – Troncador

答えて

1

両方ETCollectionを拡張していますが、この行にMyCollectionTとしてコレクションを扱いたい:

return myCollection != null && myCollection.containsAll(c); 

あらゆるCollectionはタイプTからのものではないので、間違っている可能性があります。

とにかくあなたがこのタイプのキャストが安全であることを確信している場合は、単にそれを無視して、その警告を抑制するために

@SuppressWarnings("unchecked") 

を使用しています。

0

問題は、あなたが2ジェネリックを定義する必要があることです。

  • Cコレクション
  • Eの種類のコレクション

の内容のために、私はあなたを固定コード、今は警告がありません

interface MyCollection<C> { 
    boolean containsAll(C c); 
    boolean addAll(C c); 
} 

public class MyPersonalCollection<E, C extends Collection<E>> 
    implements MyCollection<C> { 
    private C collection; 

    public MyPersonalCollection(C myCollection) { 
    this.collection = myCollection; 
    } 

    public boolean containsAll(C c) { 
    return collection != null && collection.containsAll(c); 
    } 

    public boolean addAll(C c) { 
    return collection != null && collection.addAll(c); 
    } 
} 

あなたはこのようなテストでは、あなたのクラスを使用することができます。

MyPersonalCollection<String, LinkedList<String>> myCollection = 
    new MyPersonalCollection<String, LinkedList<String>>(list); 
関連する問題