我有一個應用程序,在節點和邊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.
}
是否有更好的方法來設計呢?
該解決方案不允許調用者使用它返回的具體子類的細節而不執行不安全的強制轉換。在路上踢罐子。 –