java - 如何设置 List 类型的变量类型为 ArrayList 的值使用构造函数
问题描述
图节点的实现如下(我无法更改实现,因为它来自编码网站):
class Node {
public int val;
public List<Node> neighbors;
public Node(int _val, ArrayList<Node> _neighbors) {
val = _val;
neighbors = _neighbors;
}
}
如果我将一个节点传递给下面的 copyGraph 函数,我将无法通过调用 Node 构造函数来制作该节点的副本,因为我得到
不兼容的类型:无法将 List 转换为 ArrayList
class Solution {
public Node copyGraph(Node node) {
Node n = new Node(node.val, node.neighbors);
//do some code
}
}
我怎么能用这个实现创建一个新节点?
解决方案
问题
该 API 设计不佳,仅供参考。构造函数应该接受 aList
而不是ArrayList
. 理想情况下,该代码将是:
public Node ( int _val , List < Node > _neighbors ) { … }
Collection
……如果顺序不重要,甚至可能更普遍。
public Node ( int _val , Collection < Node > _neighbors ) { … }
解决方法
解决这种糟糕设计的两种方法:强制转换或复制。
- 如果您确定您的
List
对象实际上是一个, 转换,如coconanArrayList
的正确答案所示。 - 如果您不确定
List
对象的具体实现,请ArrayList
在传递您的List
.
Node n = new Node ( node.val, new ArrayList < Node > ( nodesList ) );
推荐阅读
- java - JOOQ 与 Oracle19c:DSL 正确的 Oracle 版本
- jmc - 如何在 JMC 8 上生成 HTML JFR 报告?
- reactjs - 你怎么能在一个功能组件中做两个返回?
- c# - Websocket 连接失败
- laravel - 在 laravel 中使用选择选项作为变量
- python - Django - 查询帖子及其回复数?
- web - 我如何在我的网站上显示我的 minecraft 服务器的内存和 cpu 使用情况
- sas - 在 SAS 中从具有递增索引的宏变量创建变量
- javascript - axios拦截器错误处理中的承诺堆栈
- date - 从时间戳到日期的 Cassandra 更改列类型