我将如何修改它,使最终的Collection(newNodes)与传入的Collection(节点)具有相同的类型?

public void setNodes(Collection<NodeInfo> nodes) {
    Collection<NodeInfo> newNodes = new TreeSet<NodeInfo>();
    for (NodeInfo ni: nodes) {
        newNodes.add(ni.clone());
    }
}


我怀疑那是...

public void setNodes(<T extends Collection<NodeInfo>> nodes) {
    Collection<NodeInfo> newNodes = new T<NodeInfo>()


这可能吗?

最佳答案

不幸的是,用Java编写它是不可能的。如果需要此效果,则有几种选择:

如果要针对特定​​种类的集合进行优化,则可以使用instanceof检查来检测它。 (例如,Guava库经常这样做以检测不可变的集合并进行特殊处理。)

如果您确实只需要填充一个集合,则可以要求呼叫者为您提供一个集合。

public <C extends Collection<NodeInfo>> void setNodes(C nodes, C newNodes) {
  for (NodeInfo ni : nodes) {
    newNodes.add(ni);
  }
}


如果需要根据需要进行任意数量的这些集合的功能,则可以定义一个工厂接口,并让调用者提供它的实例:

interface Factory<C extends Collection<NodeInfo>> {
  C newCollection();
}

public <C extends Collection<NodeInfo>> void setNodes(C nodes, Factory<C> factory) {
  C newNodes = factory.newCollection();
  for (NodeInfo ni : nodes) {
    newNodes.add(ni);
  }
}

10-06 09:04