2012-02-21 29 views
2

我不知道为什么下面的代码不能工作:无法分配给<T扩展INode>类型变量的INode类型值。为什么?

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

T是一个inode,但inode不是T. 所以你不能把INode.clone()(对象或i节点)的结果为T. 名单这就是为什么你需要一个投

Regards

0

首先,我想这inode是一个接口,是因为它是在对象中定义的clone()方法不应该用于直接。你应该在界面中定义一个clone()方法,或者让INode扩展Cloneable,然后将克隆的节点转换为T.

此外,当你写我时,你需要将你的克隆对象转换为T,因为你知道T和克隆将inode的实例,但你不知道的是,克隆是T.

的实例
0

首先,我怀疑在INode类,你有没有重新申报的clone方法和实现接口Cloneable

另外,为了将克隆插入到参数化列表中,需要强制转换为T

相关问题