为什么这段代码需要投射?

时间:2016-05-27 00:45:38

标签: java generics casting linked-list variadic-functions

我正在研究泛型,根据我的理解,我们使用泛型,因此我们可以避免/消除强制转换的需要,那么为什么我必须在添加项目和链接列表时进行投射?

def filled_rectangle(t, l, w):
    t.begin_fill()
    for i in range(2):
            t.right(90)
            t.forward(l)
            t.right(90)
            t.forward(w)
    t.endfill()

我也必须在这个方法中进行转换,并且在数组中?我不认为我应该将项目放入数组中,所以我有点困惑。

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

    }

3 个答案:

答案 0 :(得分:6)

你不需要演员,你添加了错误的东西。此

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

应该是

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

list.add((E)thingie);

应该是

list.addAll(thingie);

答案 1 :(得分:1)

  

我们使用泛型,因此我们可以避免/消除投射的需要

这不是100%正确,我们对type safety使用泛型。缺乏必要 铸造只是仿制药带来的众多好处之一。

你需要在你的物品中投射物品的原因 foreach循环是因为您自己添加了item列表 在循环的每次迭代中链接到您的链表。你是什​​么 应该做的是添加数组的元素。

这就是你的意思:

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

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

答案 2 :(得分:0)

您的代码已经说明了

  

对于项目中的每个E

。因此,期望项目返回E对象。另外,我不确定。但代码:

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

被认为是

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

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