Ho un'applicazione che esegue vari algoritmi di analisi su grafici di nodi e bordi G (N, E). Gli attributi di nodi e spigoli variano con l'applicazione e formano una gerarchia di ereditarietà in base al tipo di grafico e alla natura degli attributi. Ad esempio, la radice della gerarchia del nodo potrebbe rappresentare i più comuni grafici ciclici non indirizzati (NcgNode). Una sottoclasse di NcgNode potrebbe rappresentare grafici ciclici diretti (DcgNode), seguiti da DagNode, ecc. Gli algoritmi che possono essere applicati ai DAG sono diversi da quelli degli NCG, ma non viceversa. Un comportamento chiave della radice dell'albero è quello di aggiungere e recuperare nodi adiacenti del grafico. La domanda è come farlo senza creare un'eccezione "non controllata"?Ereditarietà e generici
Una versione concisa del codice potrebbe assomigliare a questo:
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.
}
C'è un modo migliore per progettare questo?
Questa soluzione non consente al chiamante di utilizzare le specifiche della sottoclasse concreta che restituisce senza eseguire un cast non sicuro. Calcia la lattina in fondo alla strada. –