无法为<t extends =“”inode =“”>类型变量分配INode类型值。为什么呢?</T>

时间:2012-02-21 11:59:47

标签: java generics

我想知道为什么以下代码无效:

public static <T extends INode> List<T> cloneList(List<T> list) {
    List<T> result = new ArrayList<T>(list.size());

    for (T t : list)
        result.add(t.clone()); <--- problem here

    return result;
}

INode.clone()INode返回类型,我们知道每个T都必须实现INode,所以我很惊讶上面的代码无法编译。我上面展示的内容是否存在语义问题?

编辑:也许是因为在编译时Java会擦除泛型类型,然后仍需要强制转换?难道编译器不能为我做这件事吗?

EDIT2:这是INode

public interface INode {
    INode accept(Visitor visitor);
    INode clone();
}

由于

3 个答案:

答案 0 :(得分:3)

T是一个INode,但INode不是一个T. 所以你不能把INode.clone()(Object或Inode)的结果放到T的列表中。 这就是你需要演员

的原因

此致

答案 1 :(得分:0)

首先,我认为INode是一个接口,因此clone()方法不应该直接可用,因为它是在Object中定义的。您应该在接口中定义clone()方法,或者使INode扩展Cloneable,然后将克隆的节点转换为T.

此外,您在编写时,需要将克隆对象强制转换为T,因为您知道T和克隆都是INode的实例,但您不确定克隆是否是T的实例。

答案 2 :(得分:0)

首先,我怀疑你没有在clone类中重新声明INode方法并实现接口Cloneable

此外,为了将克隆插入参数化列表,需要转换为T