簡體   English   中英

為什么此代碼需要強制轉換?

[英]Why does this code require casting?

我現在正在研究泛型,據我了解,我們使用泛型,因此可以避免/消除強制轉換的需要,那么為什么在添加項目和鏈表時必須強制強制轉換?

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);

}

您不需要強制轉換 ,您添加了錯誤的內容。 這個

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

應該

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

list.add((E)thingie);

應該是這樣的

list.addAll(thingie);

我們使用泛型,因此我們可以避免/消除強制轉換的需要

那不是100%正確,我們使用泛型來確保類型安全 無需強制轉換只是泛型帶來的眾多好處之一。


之所以需要在foreach循環中強制轉換對象,是因為您在循環的每次迭代中都將item列表本身添加到了鏈表中。 您應該做的是添加數組的元素。

這就是您要執行的操作:

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

您需要在此行中再次投射對象的原因: list.add((E)thingie); ,是因為您將鏈接列表添加到鏈接列表中,而不是列表中的元素。 您在這里應該做的是遍歷所有元素,並一一添加。 或使用Java的內置方法之一。

您的代碼已經說過

對於項目中的每個E

因此,預期item返回E對象。 另外,我不確定。 但是代碼:

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

應該是

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

它是E的列表。 基於第三行。 不是E數組的列表。希望可以澄清一下。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM