我有一个应用程序,在节点和边G(N,E)的图上执行各种分析算法。节点和边的属性随应用程序而变化,并根据图的类型和属性的性质形成继承层次结构。例如,节点层次结构的根可以表示最一般的非定向循环图(NcgNode)。 NcgNode的一个子类可能代表有向循环图(DcgNode),接着是DagNode等。可应用于DAG的算法不同于NCG的算法,但反之亦然。树的根的关键行为是添加和检索图的相邻节点。问题是如何在不创建“未检查”异常的情况下执行此操作?继承和泛型
代码的简洁版本可能是这样的:
import java.util.ArrayList;
import java.util.List;
public class NcgNode {
private List<NcgNode> nodeList_ = null;
private List<? extends NcgNode> nodeListSrc_ = null;
private List<? super NcgNode> nodeListSink_ = null;
public <N extends NcgNode> void addNode(N node) {
if (nodeList_ == null) {
nodeList_ = new ArrayList<NcgNode>();
nodeListSrc_ = nodeList_;
nodeListSink_ = nodeList_;
}
nodeListSink_.add(node);
}
@SuppressWarnings("unchecked")
// Any way to avoid this?
public <N extends NcgNode> N getNode(int n) {
if ((nodeList_ == null) || (n >= nodeList_.size()))
return null;
// causes unchecked warning:
return (N) nodeListSrc_.get(n);
}
}
class DcgNode extends NcgNode {
// enables DCG algorithms, etc
}
class DagNode extends DcgNode {
// enables DAG algorithms, etc.
}
是否有更好的方法来设计呢?
该解决方案不允许调用者使用它返回的具体子类的细节而不执行不安全的强制转换。在路上踢罐子。 –