为什么这段代码需要转换?

Why does this code require casting?

我现在正在研究泛型,据我了解,我们使用泛型是为了 avoid/remove 转换的需要,那么为什么我在添加项和链表时必须转换?

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

}

您不需要 cast,您添加了错误的内容。这个

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

应该是

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

list.add((E)thingie);

应该是这样的

list.addAll(thingie);

we use generics so we can avoid/remove the need to cast

这不是 100% 正确,我们对 type safety 使用泛型。缺乏需要 for casting 只是泛型给 table.

带来的众多好处之一

您需要将对象投射到 foreach 循环是因为您要添加 item 列表本身 在循环的每次迭代中添加到您的链表。你什么 应该做的是添加数组的元素。

这就是你想要做的:

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

您需要在此行中再次投射对象的原因:list.add((E)thingie);, 是因为您将链表添加到链表 - 而不是元素 的名单。你应该在这里做的是遍历所有元素 并一一相加;或使用 java 的内置方法之一。

您的代码已经说明

for each E in item

。所以 item 应该是 return 一个 E 对象。另外,我不确定。但是代码:

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

应该是

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

这是E的列表。基于第 3 行。不是 E 数组的列表。希望它能给出一些说明。