私は、ノードとエッジ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.
}
これを設計するためのより良い方法はありますか?
このソリューションでは、呼び出し元が安全でないキャストを実行せずに返される具象サブクラスの仕様を使用することはできません。缶を蹴って道を踏み出す –