Mam aplikację, która wykonuje różne algorytmy analizy na wykresach węzłów i krawędzi G (N, E). Atrybuty węzłów i krawędzi różnią się w zależności od aplikacji i tworzą hierarchię dziedziczenia w oparciu o typ wykresu i charakter atrybutów. Na przykład katalog główny hierarchii węzłów może reprezentować najbardziej ogólne niekierowane wykresy cykliczne (NcgNode). Podklasa NcgNode może reprezentować ukierunkowane wykresy cykliczne (DcgNode), a następnie DagNode itp. Algorytmy, które można zastosować do DAG, różnią się od algorytmów NCG, ale nie odwrotnie. Kluczowym zachowaniem katalogu głównego drzewa jest dodawanie i pobieranie sąsiednich węzłów na wykresie. Pytanie brzmi, jak to zrobić bez tworzenia wyjątku "niezaznaczonego"?Dziedziczenie i generics
lakoniczny wersja kodu może wyglądać następująco:
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.
}
Czy istnieje lepszy sposób projektowania jest?
To rozwiązanie nie pozwala rozmówcy na użycie specyfiki konkretnej podklasy, którą zwraca, bez wykonywania rzutu niebezpiecznego. Kopanie puszki w dół drogi. –