图节点的实现如下(我无法从编码网站更改实现(:
class Node {
public int val;
public List<Node> neighbors;
public Node(int _val, ArrayList<Node> _neighbors) {
val = _val;
neighbors = _neighbors;
}
}
如果我将一个节点传递给下面的copyGraph函数,我将无法通过调用node构造函数来复制该节点,因为我得到了
不兼容的类型:列表无法转换为ArrayList
class Solution {
public Node copyGraph(Node node) {
Node n = new Node(node.val, node.neighbors);
//do some code
}
}
否则,我怎么能用这个实现创建一个新的Node?
问题
API设计不好,仅供参考。构造函数应该接受List
而不是ArrayList
。理想情况下,代码应该是:
public Node ( int _val , List < Node > _neighbors ) { … }
……或者如果顺序不重要,甚至可能是更通用的Collection
。
public Node ( int _val , Collection < Node > _neighbors ) { … }
变通办法
有两种方法可以解决这种糟糕的设计:铸造或复制。
- 如果您确信您的
List
对象实际上是ArrayList
,请按照coconan的正确答案进行强制转换 - 如果您不确定
List
对象的具体实现,请在传递List
的同时构造一个新的ArrayList
Node n = new Node ( node.val, new ArrayList < Node > ( nodesList ) );
您可以使用(ArrayList<node>(将node.neighbors强制转换为ArrayList
node.neighbors
class Solution {
public Node copyGraph(Node node) {
Node n = new Node(node.val, (ArrayList<Node>) node.neighbors);
//do some code
}
}