我将如何修改它,使最终的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);
}
}