我想知道为什么以下代码无效:
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
,所以我很惊讶上面的代码无法编译。我上面展示的内容是否存在语义问题?
EDIT2:这是INode
:
public interface INode {
INode accept(Visitor visitor);
INode clone();
}
由于
答案 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
。