ノードとエッジ 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.
}
これを設計するより良い方法はありますか?