2016-05-27 10 views
-1

私はジェネリック医薬品を研究しています。私たちはジェネリック医薬品を使用しているので、キャストの必要性を避ける/除去することができます。なぜアイテムとリンクリストを追加するときにキャストする必要がありますか?なぜこのコードでキャストする必要がありますか?

public class ThisIsCode<E> implements Code{ 

    LinkedList<E> list = new LinkedList<>(); 

    public final void add(E... item) { 
     List<E> thingie = new LinkedList<>(); 

     for (E i: item) { 
      thingie.add((E) item); 
     } 

     list.add((E)thingie); 

    } 

また、この方法でもキャストしなければならないのですか?私はアイテムを配列に入れておくべきではないと思うので、ちょっと混乱します。

public void addSingle(Object item) { 
    add((E[]) item); 

} 
+2

もう一度、全体のメソッドを 'list.addAll(Arrays.asList(items)) 'に置き換えてください。 –

答えて

6

あなたが間違ったことを追加している、キャストを必要としません。この

for (E i: item) { 
    thingie.add((E) item); 
} 

for (E i: item) { 
    thingie.add(i); 
} 

list.add((E)thingie); 

する必要がありますが

我々は削除/避けることができるように私たちはジェネリックを使用
list.addAll(thingie); 
+0

ああ、ありがとう! varargsは本当に私には新しいものです。 list.add()とlist.addAll()の違いは何ですか? – alnmod

+0

['List.addAll(Collection )'](http://docs.oracle.com/javase/8/docs/api/java/util/List.html#addAll-java.util.Collection-)には、 itemを 'Collection'から' list'に変更します。 ['List.add(E)'](http://docs.oracle.com/javase/8/docs/api/java/util/List.html#add-E-)は、タイプ ' E'を 'list'に追加します。 –

+0

add((E [])アイテムについて何かできますか?) – alnmod

1

のようなものでなければなりませんキャストする必要があります

これは100%ではありません。type safetyのジェネリックを使用しています。キャスト用の必要性の欠如は、ジェネリックがテーブルにもたらす多くの利点の1つに過ぎません。


あなたは、ループの各反復であなたのリンクリストにitemリスト自体 を追加しているので、あなたがあなたの foreachループで、あなたのオブジェクトをキャストする必要がしている理由があります。 は、配列の要素を追加するだけです。

これは、あなたがする何を意味するのかである:

for (E i: item) { 
    thingie.add(i); 
} 

あなたはこのラインで再びあなたのオブジェクトをキャストする必要がある理由:list.add((E)thingie);、あなたがリンクリストにリンクされているリストを追加するため がある - ない要素リストの ここでやるべきことは、すべての要素を反復して、それを一つずつ追加することです。またはJavaの組み込みメソッドのいずれかを使用します。

0

あなたのコードは、すでに述べているアイテム

内の各Eについて

います。アイテムはEオブジェクトを返すと予想されます。また、私は確信していません。しかしコード:

for (E i: item) { 
    thingie.add((E) item); 
} 

for (E i: item) { 
    thingie.add(i); 
} 

それはEのリストがあることをsupossedされます。 3行目に基づいています。 Eの配列のリストではありません。

関連する問題